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 57

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"

to:

android:configChanges="orientation|keyboardHidden|screenSize" 

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

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

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

      android:configChanges="orientation|keyboardHidden|screenSize"

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

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

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

<android:configChanges="orientation|screenSize" >

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