1

我正在制作一个在某个 FragmentActivity 中有一个 Tabhost 托管 2 个片段的应用程序。其中一个必须显示布局 A 或显示布局 B,而另一个始终具有相同的布局。

  • 片段活动
    • 片段 1(第一个选项卡)
      • 布局A
      • 布局B
    • Fragment2(第二个选项卡)
      • 布局C

为了将两种布局的控制封装在单独的模块中,我制作了两个 Fragment,即 FragmentA 和 FragmentB,分别使用 LayoutA 和 LayoutB,使 Activity 看起来像这样:

  • 片段活动
    • 片段 1(第一个选项卡)
      • 片段A
        • 布局A
      • 片段B
        • 布局B
    • Fragment2(第二个选项卡)
      • 布局C

我遇到的问题是我无法使这两种情况都稳定:

  • 显示第一个选项卡时用户离开应用程序
  • 用户导航到选项卡 2,然后返回选项卡 1

起初我的 Fragment1 代码如下所示:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = new FrameLayout(getActivity());
    view.setId(1);
    return view;
}

@Override
public void onStart() {
    super.onStart();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.add(1, mCurrentFragment, "f1");
    ft.commit();
}

@Override
public void onStop() {
    super.onStop();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.remove(mCurrentFragment);
    ft.commit();
}

在 onStop 中,我删除了片段,以便在片段下次重新启动时将其附加到在 OnCreateView 中创建的新 FrameLayout。这段代码的问题是,当用户离开应用程序时,我显然无法进行任何交易,所以它崩溃了。

java.lang.RuntimeException: Unable to stop activity {my.package/my.package.MainTabHost}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

为了解决这个问题,我在尝试将片段添加到 onStart 中的 FragmentTransaction 之前更改了片段的删除:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = new FrameLayout(getActivity());
    view.setId(1);
    return view;
}

@Override
public void onStart() {
    super.onStart();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    if(getFragmentManager().findFragmentByTag("f1") != null) {
        ft.remove(mCurrentFragment);
    }
    ft.add(1, mCurrentFragment, "f1");
    ft.commit();
}

这段代码还有另一个问题。从第一个选项卡切换到第二个选项卡然后返回到第一个选项卡显示 Fragment1 的空白布局。

注意:我将所有片段设置为保留其状态。

4

1 回答 1

0

解决了!我使用了第二个代码。我必须在 onStart 中执行以下步骤: - 分离片段 - 将其添加到新视图 - 附加它

于 2013-02-11T05:32:44.010 回答