在方向更改期间保存选项卡状态

chi*_*jib 9 android

我有2个选项卡,例如Tab1和Tab2,它显示在屏幕上.让标签显示在PORTRAIT方向上.

Tab1显示Activity1和Tab2显示Activity2.

目前,选定的选项卡状态为Tab2.现在,我将PORTRAIT的方向更改为LANDSCAPE.在将方向更改为LANDSCAPE模式时,不显示Tab2,而是显示当前的Tab1.

基本上,我想在方向改变时保存Tab状态.

为了执行保存选项卡状态的目的,我正在编写以下代码:

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));

}
Run Code Online (Sandbox Code Playgroud)

我想知道,我的方法是否正确以及上述代码是否是在更改方向时保存选项卡状态的正确方法.

Cri*_*ian 18

这不是它应该做的方式......而是使用:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("tabState", getSelectedTab());
}
Run Code Online (Sandbox Code Playgroud)

然后,在onCreate方法上:

public void onCreate(Bundle state){
     // do the normal onCreate stuff here... then:
     if( state != null ){
         setCurrentTab(state.getInt("tabState"));
     }
}
Run Code Online (Sandbox Code Playgroud)

Robby的解决方案也将起作用,并涉及使用该onRetainNonConfigurationInstance方法.我实际上喜欢并喜欢这种方法,onSaveInstanceState因为它允许你保存一个代表应用程序状态的复杂对象,而不仅仅是一个内部的parceables Bundle.

那么何时使用其中一个呢?这取决于保存/恢复应用程序状态所需的数据.对于像保存选项卡状态这样的简单事情,它几乎是一样的.

  • 您还可以使用`mActionBar.getSelectedTab().getPosition()`获取位置,并使用`mActionBar.setSelectedNavigationItem(int)进行设置. (7认同)

Rob*_*ond 2

这不是最好的方法。您应该使用 onRetainNonConfigurationInstance() 和 getLastNonConfigurationInstance() 来保留配置更改之间的状态。这些方法专门用于在配置更改期间保存状态。

public Object onRetainNonConfigurationInstance() {
    return mTabHost.getCurrentTab();
}

public void onCreate() {
   ...
   Integer lastTab = (Integer) getLastNonConfigurationInstance();
   if(lastTab != null) {
      mTabHost.setCurrentTab(lastTab);
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)