屏幕旋转时保存标签页状态

9

我有两个标签,例如Tab1和Tab2,显示在屏幕上。让它们在竖屏方向显示。

Tab1显示Activity1,Tab2显示Activity2。

当前,所选标签状态为Tab2。现在,我将方向从PORTRAIT改为LANDSCAPE。在将方向更改为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个回答

18

这不是正确的做法... 相反应该使用:

@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"));
     }
}
Robby的解决方案也可行,它涉及使用onRetainNonConfigurationInstance方法。我实际上喜欢并更倾向于使用该方法而不是onSaveInstanceState,因为它允许您保存表示应用状态的复杂对象,而不仅仅是Bundle中的可解析对象。
那么什么时候使用其中之一呢?这取决于您需要保存/恢复应用程序状态的数据。对于像保存选项卡状态这样的简单事物,两者几乎相同。

7
你可以使用 mActionBar.getSelectedTab().getPosition() 获取位置,并使用 mActionBar.setSelectedNavigationItem(int) 进行设置。 - Dori
ActionBar在这个问题被提出和回答时不存在,他也正在使用TabHost类。 - Cristian
@Dori 感谢您的评论,对我很有帮助,因为现在已经是2013年了,许多人正在使用带有导航选项卡的操作栏 :) - AgentKnopf

2

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

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

public void onCreate() {
   ...
   Integer lastTab = (Integer) getLastNonConfigurationInstance();
   if(lastTab != null) {
      mTabHost.setCurrentTab(lastTab);
   }
   ...
}

感谢Robby的回复。您能否详细说明一下lastTab参数和方法setActiveTab(lastTab)? - chiranjib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接