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 a Fragment? Если да, то почему он указан как запись в вашей декларации?

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


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

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

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

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

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

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

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

        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" в дополнение к значению "orientation". То есть, вы должны decalare android:configChanges="ориентация|screenSize". Однако, если ваше приложение нацелено на уровень API 12 или ниже, то ваша активность всегда обрабатывает это изменение конфигурации сама (это изменение конфигурации не перезапускает вашу активность, даже при запуске на устройстве Android 3.2 или выше).


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

Я поменял:

android:configChanges="orientation|keyboardHidden"

в:

android:configChanges="orientation|keyboardHidden|screenSize" 

которые предотвращают перезапуск активности.


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

1) В Манифесте,

      android:configChanges="orientation|keyboardHidden|screenSize"

2) в файл класса, переопределить данные метода onsaveinstance мест(Bundle outState). Вот так! Наслаждайтесь :)


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


добавьте это в Manifeast.В XML

<android:configChanges="orientation|screenSize" >

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