在方向更改期间保存标签状态
问题描述:
我有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));
}
我想知道,是我的做法正确与否&上面的代码是否是一个适当的方式在改变方向时保存标签状态。
答
这不是最好的方法。您应该使用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
中的parceables。
那么何时使用其他的?这取决于您需要保存/恢复应用程序状态的数据。对于保存标签状态等简单的事情来说,它几乎是一样的。
感谢Robby的回复。你能否详细说明/提供有关lastTab参数和方法setActiveTab(lastTab)的详细信息? – chiranjib 2011-03-15 21:06:54
lastTab只是一个localVariable。我会更新这个例子。 – 2011-03-15 22:57:09