片段不会从后台弹出?

时间:2017-11-10 09:00:53

标签: android android-fragments fragment-backstack

我有三个片段A,B和C

enter image description here 这是路径:A - > B - > C: A 转到 B B 转到 C

当我从片段C返回时,我想转到片段A。

  • A< - C: C 返回根片段 A
  • A< -B: B 返回根片段 A

但我的问题是当我回到片段C时,我得到了这个行为:似乎片段C没有从后台堆栈中清除:enter image description here

至于我的代码,这是replaceFragment的方法:

public void replaceFragment(Fragment fragment, boolean withBackStack) {
    android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    String fragmentTag = fragment.getClass().getName();
    fragmentTransaction.replace(R.id.frame, fragment, fragmentTag);
    if (withBackStack)
        fragmentTransaction.addToBackStack(fragmentTag);
    try {
        fragmentTransaction.commitAllowingStateLoss();
    } catch (IllegalStateException ex) {
        ex.printStackTrace();
    }
}

首先我在replaceFragment(new AFragment(), false);中调用了MainActivity,然后在片段A 中点击了按钮,我调用了mListener.replaceFragment(new BFragment(), true);  最后,在点击按钮的片段B 中,我拨打了mListener.replaceFragment(new CFragment(), false);

有没有人对此行为有解释?单击后退时不应清除最后一个片段C?

Here,你会发现整个例子。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

由于你没有在backstack中添加fragC而不会弹出存储的事务,因此不会删除它。在这里你必须通过覆盖backpress.Overiride backpress删除片段并检查fragC并删除它然后调用pospstack弹出存储的事务。

还将片段实例存储为全局,以检查片段是否为fragC。

private Fragment mFragment;

在你的方法中存储实例

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        Fragment fragment = getSupportFragmentManager().findFragmentByTag(mFragment.getClass().getName());
        if (fragment != null && fragment.getClass().getName().equalsIgnoreCase(CFragment.class.getName())) {
            getSupportFragmentManager().beginTransaction().remove(mFragment).commit();
        }
        getSupportFragmentManager().popBackStackImmediate();
    } else {
        super.onBackPressed();
    }
}

答案 1 :(得分:0)

基于@Anonymous的答案,我找到了解决这个问题的一般方法:

  @Override
    public void onBackPressed() {
        Fragment currentFragment= getSupportFragmentManager().findFragmentById(R.id.frame);
        super.onBackPressed();

        if(currentFragment!=null && currentFragment.isVisible()) {
            getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
            getSupportFragmentManager().popBackStack(currentFragment.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }

    }