2011-04-15 40 views
2

您好我有4个选项卡(让我们说tab1,tab2,tab3,tab4)的Android应用程序。当活动开始时,默认选项卡是tab1。比我切换到任何其他选项卡(选项卡2,3或4)并更改屏幕方向,它总是重置为默认选项卡(选项卡1)。在屏幕旋转选项卡更改[Android]

我试着用下面的代码:

@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是私人诠释,并默认设置为0,但它被设置在TabChange :

public void onTabChanged(String tabId) { 
    ... some code 
    CurrentTab = tabHost.getCurrentTab(); 
} 

我堆放在这里...有没有其他方法可以解决这个问题?

不久:我想要的标签没有改变默认在屏幕上旋转......

回答

7

的问题是,在configur如同屏幕旋转一样,当前活动被破坏并重新创建。如果选项卡活动包含选项卡活动本身以及每个选项卡的活动。

所以当它重新创建时,它只是显示第一个选项卡,因为它没有其他信息。

要解决此问题,您可以覆盖您的选项卡活动的onRetainNonConfigurationInstance()并返回当前选定的选项卡。在选项卡活动的onCreate上,然后调用getLastNonConfigurationInstance(),它返回您在onRetainNonConfigurationInstance()中返回的对象。如果该对象为空,则知道没有方向更改,因此只需选择第一个选项卡,如果它不为空,则会出现屏幕旋转,并且您可以使用返回的值决定之前选择哪个选项卡并设置它再次。

+0

这个解决方案听起来很完美......是否有可能将更多的数据存储到Object并重用它?我会感谢短代码预览...谢谢! – 2011-04-18 07:44:33

+0

由于方法签名只说你必须返回一个对象,你可以返回你想要的东西。所以如果你想返回多个对象,只需实现一个容器类,它可以存储你需要的所有对象。 – Flo 2011-04-18 12:19:08

2

所以你必须在你的活动的onSaveInstanceState覆盖(束)

堂妹时屏幕来实现这个旋转活动重新

编辑:

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

你的意思是?像: '@Override public void onTabChanged(String tabId,Bundle savedInstanceState){super.onCreate(savedInstanceState); ...部分代码 CurrentTab = tabHost.getCurrentTab(); }' – 2011-04-15 11:40:55

+0

Flo版本在这种情况下更好 – Selvin 2011-04-15 12:06:55