【问题标题】:FragmentManager.popBackStack() adds fragment below the current oneFragmentManager.popBackStack() 在当前片段下方添加片段
【发布时间】:2016-04-23 14:42:31
【问题描述】:

我正在学习如何正确使用片段。 我有 4 个片段:

  • 一个
  • B
  • 加载中
  • 完成

应该按这个顺序互相替换:

A ==> 加载中 ==> B ==> 加载中 ==> 完成

将我的 Fragment A 更改为 Loading 的方法:

    LoadingFragment loadingFragment = new LoadingFragment();

    Bundle bundle = new Bundle();
    bundle.putBoolean("fragmentA", true);

    loadingFragment.setArguments(bundle);

    getFragmentManager().beginTransaction()
            .replace(R.id.fragment_container, loadingFragment)
            .addToBackStack(null)
            .commit();

将 Fragment B 更改为 Loading 看起来相似(只有参数明显更改)

将Loading Fragment变为Fragment B的方法:

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            getFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, new FragmentB())
                    .commit();

        }
    }).start();

Thread.sleep(...) 只是一个很长的操作... 显然这次我不会加.addToBackStack(null)

好的。现在的问题:

当我使用getFragmentManager().popBackStack() 方法时,之前的片段(A)被添加到下面(我的片段容器是LinearLayout)我的实际片段而不是替换它。据此:https://stackoverflow.com/a/17793959/3279023 它应该可以工作,但事实并非如此。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您遇到的行为对我来说看起来不错。 popBackStack() 反转最后一个 saved 操作,在您的情况下是:replace A with Loading

    因此它将Loading 替换为A,但这显然对B 没有影响,您在没有记录交易的情况下添加了它。

    解决方案可能是在这两种情况下都使用addToBackStack(),以便注册两个事务,然后调用popBackStack() 两次。

    【讨论】:

      【解决方案2】:

      几个片段可以组成一个活动/屏幕。 Backstack 就像返回箭头或返回上一个活动/屏幕。

      【讨论】:

      • 我知道这个...但是addToBackStack() 方法应该记住所有事务并执行和反转
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2011-09-07
      • 1970-01-01
      相关资源
      最近更新 更多