我正在制作一个在某个 FragmentActivity 中有一个 Tabhost 托管 2 个片段的应用程序。其中一个必须显示布局 A 或显示布局 B,而另一个始终具有相同的布局。
- 片段活动
- 片段 1(第一个选项卡)
- 布局A
- 布局B
- Fragment2(第二个选项卡)
- 布局C
- 片段 1(第一个选项卡)
为了将两种布局的控制封装在单独的模块中,我制作了两个 Fragment,即 FragmentA 和 FragmentB,分别使用 LayoutA 和 LayoutB,使 Activity 看起来像这样:
- 片段活动
- 片段 1(第一个选项卡)
- 片段A
- 布局A
- 片段B
- 布局B
- 片段A
- Fragment2(第二个选项卡)
- 布局C
- 片段 1(第一个选项卡)
我遇到的问题是我无法使这两种情况都稳定:
- 显示第一个选项卡时用户离开应用程序
- 用户导航到选项卡 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 的空白布局。
注意:我将所有片段设置为保留其状态。