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
aFragment
? Если да, то почему он указан как запись в вашем манифесте?посмотреть так что ответ для новых квалификаторов, которые, вероятно, будут причиной этого, если вы нацелены на 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). Вот так! Наслаждайтесь :)