android: configChanges = "ориентация" не работает с фрагментами - PullRequest
58 голосов
/ 21 августа 2011

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

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

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

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

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

Мой код:

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

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

Ответы [ 8 ]

77 голосов
/ 21 августа 2011

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

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

Если я что-то упустил, я не совсем получу вашу вторую запись манифестаРазве не AppListFragment Fragment?Если так, то почему он указан как запись в вашем манифесте?

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

37 голосов
/ 04 марта 2012

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

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

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

Я работал над пре-сота с:

           <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;
    }

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

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

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

34 голосов
/ 18 августа 2012

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

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

        android:configChanges="orientation|keyboardHidden|screenSize"
9 голосов
/ 12 октября 2012

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

4 голосов
/ 17 февраля 2016

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

Я изменил:

android:configChanges="orientation|keyboardHidden"

на:

android:configChanges="orientation|keyboardHidden|screenSize" 

Для предотвращения перезапуска активности.

1 голос
/ 01 декабря 2013

Я знаю, что это довольно поздний ответ, но недавно я столкнулся с этой проблемой и смог решить ее для действия фрагмента.Файл класса, переопределите onSaveInstanceState (Bundle outState).Это оно!Наслаждайтесь:)

0 голосов
/ 19 апреля 2018

Добавить это в Manifeast.Xml

<android:configChanges="orientation|screenSize" >

Это работа для вас.

0 голосов
/ 08 февраля 2017

В файле манифеста, внутри деятельности добавьте эту строку
android: configChanges = "клавиатура | клавиатура скрытая | ориентация | размер экрана".

...