Возврат к фрагменту с обратной связью

У меня есть фрагменты A, B, C, которые я добавляю с помощью метода add() .

Когда я достигаю фрагмента C, в какой-то момент я хочу вернуться к фрагменту A и удалить B и C.

Мой подход:

 val backStateName = FragmentA::class.java.name activity.fragmentManager.popBackStackImmediate(backStateName, FragmentManager.POP_BACK_STACK_INCLUSIVE) 

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

 val fragmentToGoTo = activity.fragmentManager.findFragmentByTag(specialTag) 

и он не возвращает нуль – это значит, что фрагмент по-прежнему доступен в фоновом стеке. popBackStackImmediate возвращает false. Зачем?

Когда вы прикрепляете фрагмент (или выполняете любое другое действие sa add / remove / detach и т. Д.), Вы можете добавить его в стопку с именем String:

 FragmentA fragmentA = (FragmentA) fragmentManager.findFragmentByTag("A"); FragmentTransaction transaction = fragmentManager.beginTransaction(); if (fragmentA != null) { transaction.attach(fragmentA); transaction.addToBackStack("attachA"); transaction.commit(); } 

Обратите внимание на строку «attachA», которую мы передали методу addToBackStack (). Позднее мы будем использовать его, чтобы вернуться. Предположим, что мы выполнили другие транзакции – добавлены / удалены / прикреплены / отсоединены некоторые другие фрагменты. Теперь, чтобы вернуться в состояние, мы вызывали один из методов popBackStack ():

 fragmentManager.popBackStack("attachA", FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Если в задний стек была добавлена ​​транзакция с именем «attachA» – метод вернет нас в это состояние.

Что касается вашего вопроса о возврате – вы, вероятно, прочитали документацию об этих методах и о том, какие значения они вернут. Я предпочитаю использовать popBackStack (), поскольку он

 /** * Pop the last fragment transition from the manager's fragment * back stack. If there is nothing to pop, false is returned. * This function is asynchronous -- it enqueues the * request to pop, but the action will not be performed until the application * returns to its event loop. * * @param name If non-null, this is the name of a previous back state * to look for; if found, all states up to that state will be popped. The * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether * the named state itself is popped. If null, only the top state is popped. * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. */ public abstract void popBackStack(String name, int flags); /** * Like {@link #popBackStack(String, int)}, but performs the operation immediately * inside of the call. This is like calling {@link #executePendingTransactions()} * afterwards. * @return Returns true if there was something popped, else false. */ public abstract boolean popBackStackImmediate(String name, int flags); 

У меня было такое же поведение. Убедитесь, что вы вызываете popBackStackImmediate в том же popBackStackImmediate что и вы добавляли его в свою заднюю часть.

Также убедитесь, что вы используете .add() вместо .replace()

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

Вы можете попробовать что-то вроде:

 fun popStack(tag: String) { var isPopped = fragmentManager.popBackStackImmediate(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE) if (!isPopped) { fragmentManager.popBackStack() //maybe a loop until you reached your goal. } } 
Intereting Posts
Как я могу отменить оповещение после нажатия кнопки «Назад» Gradle kotlin script,> Плагин с id `kotlin` не найден проблемы с макетами и ошибки в приложении android, разработанные с использованием kotlin Возможно ли получить доступ к типам Kotlin из Java? Тестирование аккских актеров с участием Котлина и Акка-Тесткита retryWhen () не вызывает то, что находится внутри Observable.just () Объявление байта в Kotlin делает ошибку времени компиляции «Целочисленный литерал не соответствует ожидаемому типу Byte» Как подавить проверку орфографии на константе строки в Android Kotlin? Ошибка приложения при попытке доступа к другому действию Нет аргумента об ошибке Многострочный макет регулярного выражения Как создать библиотеку в Kotlin и использовать ее из проектов, предназначенных для javascript или java? Kotlin: В чем разница между Apply and Also Kotlin-JS interop – использование языковых конструкций Использование AnkoLogger с уровнями, отличными от «info»