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

我有2个选项卡,例如显示在屏幕上的Tab1&Tab2。 让选项卡显示在PORTRAIT方向上。

Tab1显示Activity1和Tab2显示Activity2。

目前,选定的标签状态是Tab2。 现在,我将PORTRAIT的方向改为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)); } 

我想知道,我的方法是否正确和上面的代码是否是一个正确的方式保存标签状态改变方向。

Solutions Collecting From Web of "在方向更改期间保存选项卡状态"

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

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

Robby的解决scheme也将工作,并涉及使用onRetainNonConfigurationInstance方法。 我实际上喜欢并且比onSaveInstanceState更喜欢这种方法,因为它允许保存一个代表应用程序状态的复杂对象,而不仅仅是Bundle parceables。

那么什么时候使用其他的? 这取决于您需要保存/恢复应用程序状态的数据。 对于保存标签状态这样简单的事情来说,它几乎是一样的。