我正在创建一个应用程序,在某个FragmentActivity中有一个Tabhost托管2个碎片。 其中一个必须有一个布局A出现或布局B出现,而另一个总是相同的布局。
为了将两个布局的控件包装在不同的模块中,我制作了两个片段,分别是FragmentA和FragmentB,分别使用LayoutA和LayoutB,使活动看起来像这样:
我遇到的问题是我不能对两者都保持稳定:
起初我的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的空白布局。
注意:我设置所有片段以保持其状态。
答案 0 :(得分:0)
解决!我用了第二个代码。我不得不在onStart中执行以下步骤: - 分离片段 - 将其添加到新视图中 - 附上它