如果不存在,如何将BackStackEntry添加到BackStack中

8
我已经为我的Fragment添加了自定义键盘,现在我想在后退时实现关闭键盘的功能。
class CustomKeyboard
{
    public void init(Context context) {
        //...

        FragmentManager fragmentManager = ((Activity) context).getFragmentManager();
        boolean fragmentPopped = fragmentManager.popBackStackImmediate(TAG, 0);
        if (!fragmentPopped) {
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.addToBackStack(TAG);
            fragmentTransaction.commit();
        }
    }
}

问题是每次屏幕旋转时都会调用init,因为我在public void onActivityCreated(final Bundle savedInstanceState)中创建了CustomKeyboard。 fragmentPopped每次都是false,所以CustomKeyboard可能会被添加到BackStack超过一次。 我的问题:
是否可能在不使用getBackStackEntryCount()方法的情况下将BackStackEntry添加到BackStack中(如果不存在)?

https://developer.android.com/reference/android/app/FragmentManager.html#POP_BACK_STACK_INCLUSIVE - IntelliJ Amiya
你是想直接得到问题的答案还是解决多次调用的问题? - Elltz
@Elltz 我希望直接回答我的问题。 - Yuliia Ashomok
我相信你的代码中有一个错误。你应该发布更多的代码。 - Mimmo Grottoli
你想说的是,你必须使用一些其他方法来检查后退栈条目,而不是getBackStackEntryCount(),如果它为0,则添加片段,对吗? - Ashish Shukla
2个回答

2

请尝试以下更新后的代码。

public void init(Context context) { 

    FragmentManager fragmentManager = ((Activity) context).getFragmentManager();
    boolean fragmentPopped = fragmentManager.popBackStack(TAG, 0);
    if (!fragmentPopped) {
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.addToBackStack(TAG);
        fragmentTransaction.commit();
    }
}

2
您可以像这样做:
     FragmentManager fm= getSupportFragmentManager();

    if(fm!=null && getSupportFragmentManager().getFragments()!=null) {

        boolean fragmentPopped = fm.popBackStackImmediate(TAG, 0);

        if (!fragmentPopped && getSupportFragmentManager().getFragments().size() == 0) {

            FragmentTransaction ft = fm.beginTransaction();
            ft.addToBackStack(TAG);
            ft.commit();
        }
    }

您可以先清除Backstack,然后再替换您的碎片,具体操作如下:

...

  private void cleanBackStack() {
    FragmentManager fm = getSupportFragmentManager();
    if (fm != null && fm.getFragments() != null) {
        if (fm.getFragments().size() > 1) {

            for (int entry = 0; entry < fm.getFragments().size(); entry++) {
                fm.popBackStackImmediate();
            }
        } else if (fm.getFragments().size()==1){

            fm.popBackStack();
        }else if(fm.getFragments().size()==0){
              //REPLACE YOUR FRAGMENT
        }
    }
}

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