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" />
Ответы
Ответ 1
Основываясь на моем опыте с Honeycomb 3.0 и библиотекой совместимости (r1).
configChange="orientation"
работает с фрагментами в отношении предотвращения активности (к которой она применяется) воссоздается при изменении ориентации. Если вы хотите, чтобы fragment
не воссоздавался при повторном создании активности, вызовите setRetainInstance
в onCreate
.
Если мне не хватает чего-то, я не совсем понимаю вашу вторую запись манифеста, не AppListFragment
a fragment
? Если да, то почему он указан как запись в вашем манифесте?
См. SO ответ для новых квалификаторов, которые могут вызвать это, если вы нацеливаете sdk 13, предложите попробовать android:configChanges="orientation|screenSize"
Ответ 2
У меня была очень похожая проблема, но мне пришлось сделать несколько дополнений, чтобы заставить ее работать с различными версиями (включая ICS).
В основной деятельности приложения я добавил немного другую версию того, что предложил Джейсон.
<activity
android:name=".MyMainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name" >
У меня это работало на pre-Honeycomb с:
<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;
}
Код для состояния состояния экземпляра save:
@Override
public void onSaveInstanceState(Bundle outState)
{
if(webview.saveState(outState) == null)
Log.i(tag,"Saving state FAILED!");
else
Log.i(tag, "Saving state succeeded.");
}
Надеюсь, что это поможет.
Ответ 3
До API 13 появилось новое значение для атрибута configChanges, screenSize
Итак, если вы используете большие экраны, обязательно добавьте screenSize в свой атрибут configChanges:
android:configChanges="orientation|keyboardHidden|screenSize"
Ответ 4
Начиная с Android 3.2 (уровень API 13), "размер экрана" также изменяется, когда устройство переключается между портретной и альбомной ориентацией. Таким образом, если вы хотите предотвратить перезапуск во время изменения ориентации при разработке для уровня API 13 или выше (как объявлено атрибутами minSdkVersion и targetSdkVersion), вы должны включить значение "screenSize" в дополнение к значению "ориентация". То есть, вы должны декалировать android: configChanges = "orientation | screenSize". Однако, если ваше приложение нацелено на уровень API 12 или ниже, ваша деятельность всегда обрабатывает это изменение самой конфигурации (это изменение конфигурации не перезапускает вашу активность даже при работе на устройстве Android 3.2 или более поздней версии).
Ответ 5
У меня была такая же проблема (например, перезапуск активности) даже без фрагментов.
Я изменил:
android:configChanges="orientation|keyboardHidden"
в
android:configChanges="orientation|keyboardHidden|screenSize"
Это предотвратит перезапуск активности.
Ответ 6
Я знаю, что это довольно поздний ответ, но я недавно столкнулся с этой проблемой и смог разрешить это для Fragment Activity.
1) В манифесте
android:configChanges="orientation|keyboardHidden|screenSize"
2) В файле класса переопределите onSaveInstanceState (Bundle outState). Это оно! Наслаждайтесь:)
Ответ 7
В файле манифеста внутри операции добавьте эту строку
android: configChanges = "keyboard | keyboardHidden | orientation | screenSize".