Подтвердить что ты не робот

Android: configChanges = "ориентация" не работает с фрагментами

Я просто пытаюсь адаптировать некоторые из моих приложений для HoneyComb.

Проблема, с которой я сталкиваюсь, - это разрушение моей деятельности по изменению ориентации (пейзаж/портрет)

Когда я использовал классическую деятельность, я написал в манифесте:

Но теперь все эти строки больше не работают!

Есть ли обходной путь для этого?

Мой код:

    <activity android:name=".TwitterActivity" android:label="@string/app_name"
        android:configChanges="keyboardHidden|orientation" />

    <activity android:name=".TwitterActivity$AppListFragment"
    android:configChanges="keyboardHidden|orientation"  />
4b9b3361

Ответ 1

Основываясь на моем опыте с Honeycomb 3.0 и библиотекой совместимости (r1).

configChange="orientation" работает с фрагментами в отношении предотвращения активности (к которой она применяется) воссоздается при изменении ориентации. Если вы хотите, чтобы fragment не воссоздавался при повторном создании активности, вызовите setRetainInstance в onCreate.

Если мне не хватает чего-то, я не совсем понимаю вашу вторую запись манифеста, не AppListFragment a fragment? Если да, то почему он указан как запись в вашем манифесте?

См. SO ответ для новых квалификаторов, которые могут вызвать это, если вы нацеливаете sdk 13, предложите попробовать android:configChanges="orientation|screenSize"

Ответ 2

У меня была очень похожая проблема, но мне пришлось сделать несколько дополнений, чтобы заставить ее работать с различными версиями (включая ICS).

В основной деятельности приложения я добавил немного другую версию того, что предложил Джейсон.

<activity
android:name=".MyMainActivity"
android:configChanges="orientation|keyboardHidden|screenSize" 
android:label="@string/app_name" >

У меня это работало на pre-Honeycomb с:

           <activity
        ....
        android:configChanges="orientation|keyboardHidden" 
        .... >

Мне пришлось сделать первый пример, чтобы он работал на всех версиях. В настоящее время я использую фрагменты и ActionBarSherlock для обратной совместимости.

Я также изменил способ сохранения и перезагрузки:

        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        // Set up webview object
        View v = inflater.inflate(R.layout.webview_layout, container, false);
        webview = (WebView)v.findViewById(R.id.webview_fragment);
        webview.getSettings().setJavaScriptEnabled(true);

        // Check to see if it has been saved and restore it if true
        if(savedInstanceState != null)
        {
            if (savedInstanceState.isEmpty())
                Log.i(tag, "Can't restore state because bundle is empty.");
            else
            {
                if (webview.restoreState(savedInstanceState) == null)
                    Log.i(tag, "Restoring state FAILED!");      
                else
                    Log.i(tag, "Restoring state succeeded.");      
            }

        }
        else 
        {
            // Load web page
            webview.setWebViewClient(new MyWebViewClient());
            webview.getSettings().setPluginsEnabled(true);
            webview.getSettings().setBuiltInZoomControls(false); 
            webview.getSettings().setSupportZoom(false);
            webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);   
            webview.getSettings().setAllowFileAccess(true); 
            webview.getSettings().setDomStorageEnabled(true);
            webview.loadUrl(mTabURL);       
        }
        return v;
    }

Код для состояния состояния экземпляра save:

       @Override
    public void onSaveInstanceState(Bundle outState)
    {
        if(webview.saveState(outState) == null)
            Log.i(tag,"Saving state FAILED!");
        else
            Log.i(tag, "Saving state succeeded.");      
    }

Надеюсь, что это поможет.

Ответ 3

До API 13 появилось новое значение для атрибута configChanges, screenSize

Итак, если вы используете большие экраны, обязательно добавьте screenSize в свой атрибут configChanges:

        android:configChanges="orientation|keyboardHidden|screenSize"

Ответ 4

Начиная с Android 3.2 (уровень API 13), "размер экрана" также изменяется, когда устройство переключается между портретной и альбомной ориентацией. Таким образом, если вы хотите предотвратить перезапуск во время изменения ориентации при разработке для уровня API 13 или выше (как объявлено атрибутами minSdkVersion и targetSdkVersion), вы должны включить значение "screenSize" в дополнение к значению "ориентация". То есть, вы должны декалировать android: configChanges = "orientation | screenSize". Однако, если ваше приложение нацелено на уровень API 12 или ниже, ваша деятельность всегда обрабатывает это изменение самой конфигурации (это изменение конфигурации не перезапускает вашу активность даже при работе на устройстве Android 3.2 или более поздней версии).

Ответ 5

У меня была такая же проблема (например, перезапуск активности) даже без фрагментов.

Я изменил:

android:configChanges="orientation|keyboardHidden"

в

android:configChanges="orientation|keyboardHidden|screenSize" 

Это предотвратит перезапуск активности.

Ответ 6

Я знаю, что это довольно поздний ответ, но я недавно столкнулся с этой проблемой и смог разрешить это для Fragment Activity.

1) В манифесте

      android:configChanges="orientation|keyboardHidden|screenSize"

2) В файле класса переопределите onSaveInstanceState (Bundle outState).  Это оно! Наслаждайтесь:)

Ответ 7

В файле манифеста внутри операции добавьте эту строку
android: configChanges = "keyboard | keyboardHidden | orientation | screenSize".