2

嗨,我有带有 4 个选项卡的 Android 应用程序(比如说 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是私有 int 并且默认设置为 0,但它是在 TabChange 上设置的:

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

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

很快: 我希望选项卡在屏幕旋转时不会更改为默认值...

4

3 回答 3

7

问题是,在屏幕旋转等配置更改时,当前活动被破坏并重新创建。在选项卡活动的情况下,这包括选项卡活动本身以及每个选项卡的活动。

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

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

于 2011-04-15T11:44:45.240 回答
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"));
}
于 2011-04-15T11:35:58.483 回答
2

为了扩展Flo 的答案- 自 Honeycomb 3.2 (API 13) 以来,Activity 方法onRetainNonConfigurationInstance()已被弃用:

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

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

于 2013-08-29T09:02:20.253 回答