具有唯一值的PopBackStack

时间:2018-11-05 19:09:05

标签: android android-fragments back-button

我想添加到我的android应用程序后退按钮监听器,该监听器使用具有唯一值的popBackStack。 例如,我有片段1,2,3,4,5,我按1-> 2-> 3-> 2-> 3-> 4-> 3-> 5-> 3的顺序访问它们。

如果我位于队列末尾的片段3中,则后退按钮应将我备份到片段5,在此片段中,后退按钮应将我备份到片段4,在此时将我备份到片段2,在此时将我备份到片段1(3-> 5-> 4-> 2-> 1)。

我有可用的代码,但单击“后退”按钮可将我返回到该队列中的上一个片段(3-> 5-> 3-> 4-> 3-> 2-> 3-> 2-> 1)

view.setOnKeyListener((view1, keyCode, keyEvent) -> {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (popDone) {
                popDone = false;
                return true;
            } else {
                if (getActivity().getSupportFragmentManager().getBackStackEntryCount() > 0) {
                    popDone = true;
                    getActivity().getSupportFragmentManager().popBackStack();
                } else {
                    getActivity().finish();
                }
                return true;
            }
        }
        return false;
    });

2 个答案:

答案 0 :(得分:0)

后退动作不是问题,但要添加片段。阅读document有关使用片段的信息。我想您正在毫无意义地将每个片段都添加到堆栈中。每当不需要回退堆栈FragmentTransaction

时,请删除fragmentTransaction.addToBackStack(null);中的这一行

答案 1 :(得分:0)

伙计,将所有片段都添加到堆栈中,而不要重用它-这是不好的做法。当您需要打开片段时,可以在堆栈中对其进行检查。 我是这样的:

private void showFragmentIfNeeded(Fragment fragment) {
    if (fragmentManager.findFragmentByTag(CURRENT_FRAGMENT_TAG) != null)
        fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag(CURRENT_FRAGMENT_TAG)).commit();
    if (fragmentManager.findFragmentByTag(fragment.getClass().getSimpleName()) != null)
        fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag(fragment.getClass().getSimpleName())).commit();
    else
        fragmentManager.beginTransaction().add(R.id.fragment_container, fragment, fragment.getClass().getSimpleName()).commit();
    CURRENT_FRAGMENT_TAG = fragment.getClass().getSimpleName();
}