Сохранить состояние вкладки во время изменения ориентации

У меня есть 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,

Так когда же использовать один из других? Это зависит от данных, необходимых для сохранения / восстановления состояния приложения. Для простых вещей, таких как сохранение состояния вкладки, это почти то же самое.

Другие вопросы по тегам