恢复内部片段

时间:2013-02-11 04:27:53

标签: android android-fragments

我正在创建一个应用程序,在某个FragmentActivity中有一个Tabhost托管2个碎片。 其中一个必须有一个布局A出现或布局B出现,而另一个总是相同的布局。

  • FragmentActivity
    • Fragment1(第一个标签)
      • LayoutA
      • LayoutB
    • Fragment2(第二个标签)
      • LayoutC

为了将两个布局的控件包装在不同的模块中,我制作了两个片段,分别是FragmentA和FragmentB,分别使用LayoutA和LayoutB,使活动看起来像这样:

  • FragmentActivity
    • Fragment1(第一个标签)
      • FragmentA
        • LayoutA
      • FragmentB
        • LayoutB
    • Fragment2(第二个标签)
      • LayoutC

我遇到的问题是我不能对两者都保持稳定:

  • 用户在显示第一个标签时离开应用
  • 用户导航到标签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的空白布局。

注意:我设置所有片段以保持其状态。

1 个答案:

答案 0 :(得分:0)

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