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"  />

8 ответов

Решение

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

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

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

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

У меня была очень похожая проблема, но мне пришлось сделать пару дополнений, чтобы она работала с различными версиями (включая 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.");      
    }

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

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

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

        android:configChanges="orientation|keyboardHidden|screenSize"

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

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

Я изменился:

android:configChanges="orientation|keyboardHidden"

чтобы:

android:configChanges="orientation|keyboardHidden|screenSize" 

Это препятствует возобновлению активности.

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

1) в манифесте,

      android:configChanges="orientation|keyboardHidden|screenSize"

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

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

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

<android:configChanges="orientation|screenSize" >

Его работа для вас.

Другие вопросы по тегам