PopBackStack с уникальными значениями - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу добавить в мое приложение для прослушивания назад кнопку 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 голосов
/ 05 ноября 2018

Человек, добавлять все фрагменты в backstack и не использовать его - это плохая практика. Когда вам нужно открыть фрагмент, вы можете проверить его в backstack. Я делаю это так:

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();
}
0 голосов
/ 05 ноября 2018

Это не проблема для вашего обратного действия, но добавление фрагмента. Считайте документ об использовании фрагмента. Я полагаю, вы добавляете в backstack каждый фрагмент без смысла. Удалите эту строку из вашего FragmentTransaction, когда вам не нужен обратный стек fragmentTransaction.addToBackStack(null);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...