【问题标题】:Tab change on screen rotation [Android]屏幕旋转时的选项卡更改 [Android]
【发布时间】:2011-08-06 06:25:16
【问题描述】:

您好,我有带有 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 是 private int,默认设置为 0,但在 TabChange 上设置:

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

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

简短地说:我希望 Tab 在屏幕旋转时不会更改为默认值...

【问题讨论】:

    标签: android tabs rotation screen-rotation


    【解决方案1】:

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

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

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

    【讨论】:

    • 这个解决方案听起来很完美......是否可以将更多数据存储到 Object 并重用它?我会感谢简短的代码预览...谢谢!
    • 因为方法签名只说你必须返回一个对象,你可以返回你想要的任何东西。所以如果你想返回多个对象,只需实现一个容器类,它可以存储你需要的所有对象。
    【解决方案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"));
    }
    

    【讨论】:

    • 你是什么意思?喜欢:@Override public void onTabChanged(String tabId, Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... some code CurrentTab = tabHost.getCurrentTab(); }
    • 这种情况下Flo版本更好
    【解决方案3】:

    扩展 Flo's answer - 活动方法 onRetainNonConfigurationInstance() 自 Honeycomb 3.2 (API 13) 以来已被弃用:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多