繁体   English   中英

屏幕旋转时标签更改[Android]

[英]Tab change on screen rotation [Android]

嗨,我有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在屏幕旋转时不会更改为默认值...

问题是,在配置更改(如屏幕旋转)上,当前活动会被破坏并重新创建。 如果是选项卡活动,则包括选项卡活动本身以及每个选项卡的活动。

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

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

要扩展Flo的答案 - 自Honeycomb 3.2(API 13)以来,不推荐使用Activity方法onRetainNonConfigurationInstance() ):

此方法在API级别13中已弃用。
使用新的Fragment API setRetainInstance(boolean)代替; 这也可以通过Android兼容包在旧版平台上使用。

恕我直言,使用更容易一些。

因此,您必须通过覆盖活动中的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"));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM