it-swarm.com.ru

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

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

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

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

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

76
PJL

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

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

37
JustLearningAgain

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

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

        Android:configChanges="orientation|keyboardHidden|screenSize"
34
Thomas Gatt

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

9
Aarun

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

Я изменился:

Android:configChanges="orientation|keyboardHidden"

чтобы:

Android:configChanges="orientation|keyboardHidden|screenSize" 

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

4
Eric Fettman

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

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

      Android:configChanges="orientation|keyboardHidden|screenSize"

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

1
Prachi

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

0
R.S