getSupportFragmentManager (). findFragmentByTag () не находит нужный фрагмент - PullRequest
0 голосов
/ 11 ноября 2019

Я обновил свое приложение с SDK 26 до SDK 28, и это разрушило навигацию моего приложения. У меня есть центральная вкладка деятельности. На каждой вкладке поток приложения управляется фрагментами. Я реализовал заднее нажатие таким образом, чтобы отображался предыдущий фрагмент текущей вкладки. Код обратной печати:

   public void onBackPressed() {
        String name = fragmentManager.getBackStackEntryAt(
                fragmentManager.getBackStackEntryCount() - 1).getName();

        Fragment fragment = fragmentManager.findFragmentByTag(name);

        String tag = ((AppFragment) fragment).getPreceddingFragmentTag();

        Fragment frag = fragmentManager.findFragmentByTag(tag);
        removeFragment(fragment);
        replaceFragment(frag, tag);
    }

Я передаю тег текущего фрагмента следующему в его конструкторе, который затем выбирается методом getPreceddingFragmentTag() в приведенном выше коде. Я использую один метод, чтобы показать новые фрагменты на экране, а также удалить их при нажатии назад. Вот код для этого:

private void replaceFragment(Fragment fragment, String tag) {
        loadedFragment = (AppFragment) fragment;
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(mContainerId, fragment, tag);
        fragmentTransaction.addToBackStack(tag);
        fragmentTransaction.commit();
        invalidateOptionsMenu();
    }

Я поддерживаю backstack для отслеживания транзакций и получения текущего отображаемого фрагмента, когда пользователь нажимает назад. Метод удаления фрагмента:

private void removeFragment(Fragment fragment) {

        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(fragment);
        fragmentTransaction.commit();
    }

Мое приложение работает следующим образом: на вкладке открывается фрагмент, содержащий список, который переносит пользователя к следующему фрагменту при щелчке элемента;который также является списком, нажатие на элемент в списке приводит пользователя к фрагменту подробностей элемента.

Вот проблема:

Я перехожу от первого фрагмента к следующему, затем кдетали товара и возвращайся. Он отлично работает в первый раз.

Я нажимаю на другой элемент в списке в первом фрагменте, он отлично показывает следующий фрагмент, я нажимаю на элемент для деталей, а затем нажимаю назад. Вместо того чтобы показать фрагмент, который он должен был показать, он показывает фрагмент, который был показан в предыдущем потоке.

Я испортил дни и ночи на stackoverflow , medium и Документация для разработчиков Google и не нашли решения. Мое приложение отлично работало, SDK 26 и 28 все испортили. Кто-нибудь может помочь?

1 Ответ

1 голос
/ 12 ноября 2019

Та же проблема произошла и со мной. В моем случае эта проблема возникла из-за следующей библиотеки:

androidx.appcompat:appcompat:1.1.0

Понизьте эту библиотеку до androidx.appcompat:appcompat:1.0.0. Это, вероятно, решит проблему вашей транзакции. Я не уверен, является ли это ошибкой в ​​библиотеке, или они внесли какие-то улучшения, поскольку я не нашел никаких заметок в appcompat: 1.1.0 заметки о выпуске.

...