Android碎片 - 如果已经存在,从后台堆栈中删除碎片

4

我有一些碎片将被以下方法替换。我认为我的代码有问题,因为我想防止将一个碎片多次添加到后台堆栈中。如果我两次点击碎片B,所有实例都将被添加到后台堆栈中,并且按下返回按钮将通过创建的两个实例。

public void replaceFragment(Fragment fragment, boolean addToBackStack, boolean customAnimation) {
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    String tag = fragment.getClass().getSimpleName();
    if (customAnimation) {
        transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_bottom, R.anim.slide_in_bottom, R.anim.slide_out_bottom);
    }
    transaction.replace(R.id.fragment_container, fragment, tag);

    // remove from back stack if exists
    // always return false!
    boolean f = manager.popBackStackImmediate(tag, 0);

    if (addToBackStack) {
        transaction.addToBackStack(tag);
    }
    transaction.commit();
}
2个回答

6

保持简单,只在需要时将其添加到后退栈中。 如果要添加的片段与当前片段属于相同类别,则不将其添加到后退栈中:

public void replaceFragment(Fragment frag) {
    FragmentManager manager = getSupportFragmentManager();
    if (manager != null){
        FragmentTransaction t = manager.beginTransaction();
        Fragment currentFrag = manager.findFragmentById(R.id.content_frame);

        //Check if the new Fragment is the same
        //If it is, don't add to the back stack
        if (currentFrag != null && currentFrag.getClass().equals(frag.getClass())) {
            t.replace(R.id.content_frame, frag).commit();
        } else {
            t.replace(R.id.content_frame, frag).addToBackStack(null).commit();
        }
    }
}

1
这正是我需要的。谢谢Daniel。我有一个问题。为什么你传递了null作为返回堆栈名称?如果我传递片段标记会发生什么? - Alex

0

在你的Activity的onBackPressed方法中尝试这个:

  @Override
    public void onBackPressed() {
        FragmentManager fm = getSupportFragmentManager();

        if (fm.getBackStackEntryCount() > 0) {
            if (fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName().equals("your fragment tag")) {
                fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接