片段不会从后台弹出?

Fragment does not pop out from backstack?

我有三个片段 A、B 和 C

这是路径:A -> B -> C:A 转到 BB 转到至 C

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

但我的问题是当我在片段 C 中按下时,我得到了这个行为:似乎片段 C 没有从后台清除:

至于我的代码,这是 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();
    }
}

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

有人对此行为有解释吗?当我单击 backpressed 时,不应清除最后一个片段 C 吗?

Here ,你会找到整个例子。 提前致谢!

因为当 backpressed 不会弹出存储的事务时你没有将 fragC 添加到 backstack 它不是 removed.instead 这里你必须通过覆盖 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();
    }
}

根据@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);
        }

    }