您好我有4个标签的Android APP(比如tab1,tab2,tab3,tab4)。当活动开始时,默认选项卡是tab1。我切换到任何其他选项卡(tab2,3或4)并更改屏幕方向,它总是重置为默认选项卡(tab1)。
我尝试使用以下代码:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
createView();
}
在createView()里面我有:
private void createView()
{
... // Tabs are created before
tabHost.getTabWidget().setCurrentTab(CurrentTab);
}
CurentTab
是private int,默认设置为0,但是在TabChange上设置:
public void onTabChanged(String tabId) {
... some code
CurrentTab = tabHost.getCurrentTab();
}
我在这里堆积......有没有其他方法可以解决这个问题?
很快:我希望屏幕旋转时Tab不会更改为默认值...
答案 0 :(得分:7)
问题是,在配置更改(如屏幕旋转)上,当前活动会被破坏并重新创建。如果是选项卡活动,则包括选项卡活动本身以及每个选项卡的活动。
因此,当它重新创建时,它只显示第一个标签,因为它没有其他信息。
要解决此问题,您可以覆盖选项卡活动的onRetainNonConfigurationInstance()
并返回当前选定的标签。在选项卡活动的on onCreate中,然后调用getLastNonConfigurationInstance()
,它返回您在onRetainNonConfigurationInstance()中返回的对象。如果对象为null,则表示没有方向更改,因此您只需选择第一个选项卡,如果它不为null,则表示屏幕旋转,您可以使用返回的值来确定之前选择的选项卡并设置它再次。
答案 1 :(得分:2)
所以你必须通过覆盖活动中的onSaveInstanceState(Bundle)来实现这一点
当重新创建屏幕旋转活动时
编辑:
protected void onSaveInstanceState (Bundle outState){
outState.putInt("LastTab", tabHost.getCurrentTab());
}
protected void onCreate (Bundle savedInstanceState){
super.onCreate (savedInstanceState);
//...tabs creation
// u need to provide some code to check if "LastTab" exists in savedState
tabHost.getTabWidget().setCurrentTab(savedInstanceState.getInt("LastTab"));
}
答案 2 :(得分:2)
要扩展Flo's answer - 自Honeycomb 3.2(API 13)以来,已弃用活动方法onRetainNonConfigurationInstance()
:
此方法在API级别13中已弃用。
请改用新的Fragment
APIsetRetainInstance(boolean)
;这也可以通过Android兼容包在旧版平台上使用。
使用更容易,恕我直言。