Сохранить состояние вкладки во время изменения ориентации
У меня есть 2 вкладки, например, Tab1 & Tab2, которая отображается на экране. Пусть вкладки будут отображаться в ориентации ПОРТРЕТ.
Tab1 отображает Activity1 и Tab2 отображает Activity2.
В настоящее время выбранное состояние вкладки - Tab2 . Теперь я меняю ориентацию ПОРТРЕТА на ЛАНДШАФТ. При изменении ориентации в режим LANDSCAPE вместо отображения Tab2 отображается текущий Tab1.
По сути, я хочу сохранить состояние вкладки при изменении ориентации.
Чтобы выполнить задачу сохранения состояния вкладки, я пишу следующий код:
protected void onPause() {
super.onPause();
saveCurrentTabState(getSelectedTab());
}
private void saveCurrentTabState(int value) {
PreferenceManager.getDefaultSharedPreferences(this).edit().putInt(
"tabState", value).commit();
}
@Override
protected void onResume() {
super.onResume();
setCurrentTab(PreferenceManager.getDefaultSharedPreferences(this)
.getInt("tabState", 0));
}
Я хотел знать, правильный ли мой подход, и является ли приведенный выше код правильным способом сохранения состояния вкладки при изменении ориентации.
2 ответа
Это не лучший способ. Вы должны использовать onRetainNonConfigurationInstance() и getLastNonConfigurationInstance(), чтобы сохранить состояние между изменениями конфигурации. Эти методы предназначены для сохранения состояния во время изменений конфигурации.
public Object onRetainNonConfigurationInstance() {
return mTabHost.getCurrentTab();
}
public void onCreate() {
...
Integer lastTab = (Integer) getLastNonConfigurationInstance();
if(lastTab != null) {
mTabHost.setCurrentTab(lastTab);
}
...
}
Это не так, как нужно... вместо этого используйте:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tabState", getSelectedTab());
}
Затем на onCreate
метод:
public void onCreate(Bundle state){
// do the normal onCreate stuff here... then:
if( state != null ){
setCurrentTab(state.getInt("tabState"));
}
}
Решение Робби тоже будет работать и предполагает использование onRetainNonConfigurationInstance
метод. Я на самом деле люблю и предпочитаю этот метод onSaveInstanceState
так как это позволяет вам сохранять сложный объект, который представляет состояние приложения, а не только анализируемые внутри Bundle
,
Так когда же использовать один из других? Это зависит от данных, необходимых для сохранения / восстановления состояния приложения. Для простых вещей, таких как сохранение состояния вкладки, это почти то же самое.