从backstack弹出片段并再次添加

时间:2012-08-31 20:40:08

标签: android android-fragments

我有两个片段 friendListFragment logListFragment

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    FriendListFragment friendListFragment = (FriendListFragment)fm.findFragmentById(R.id.friend_list_fragment_container);
    LogListFragment logListFragment = (LogListFragment)fm.findFragmentById(R.id.log_list_fragment_container);

后者是在前者的 onListItemClick 事件的上下文中创建的。

    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    logListFragment = LogListFragment.newInstance(name);
    ft.add(R.id.log_list_fragment_container, logListFragment);
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        ft.hide(friendListFragment);
    }
    ft.addToBackStack(null);
    ft.commit();

每次调用 onListItemClick 时,我首先清除backstack,因为我只想在backstack上安装最新的 logListFragment

在我的活动的 onCreate 功能中,我会关注手机的方向。在纵向模式下,我清除了Backstack并以下列方式再次添加 logListFragment

    if ((logListFragment != null) && (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)) {
        fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        ft.add(R.id.log_list_fragment_container, logListFragment);
        ft.hide(friendListFragment);
        ft.addToBackStack(null);
        ft.commit();
    }

之后 friendListFragment 会按预期隐藏,但 logListFragment 也不可见。 当我按照以下方式更改代码时,它按预期工作:

    if ((logListFragment != null) && (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)) {
        LogListFragment copy = new LogListFragment();
        copy.setArguments(logListFragment.getArguments());
        fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        ft.add(R.id.log_list_fragment_container, copy); // <- use copy
        ft.hide(friendListFragment);
        ft.addToBackStack(null);
        ft.commit();
    }

当我添加 LogListFragment 的新实例时,它可以正常工作。

问题

  1. 为什么我需要创建一个新实例?
  2. 有人知道更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

也许替换片段是更好的选择?

英尺replace (int containerViewId, Fragment fragment)