Как я могу добавить последний экземпляр фрагмента в backstack (если я не знаю тег и идентификатор фрагмента)?
FragmentManager fragManager = activity.getSupportFragmentManager();
FragmentTransaction fragTransacion = fragMgr.beginTransaction();
/****After add , replace fragments
(some of the fragments are add to backstack , some are not)***/
//HERE, How can I get the latest added fragment from backstack ??
android
android-fragments
back-stack
Leem.fin
источник
источник
FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
илиFragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
docstack
если я не могу получить доступ к фрагменту с помощью метода pop?функция возвращает ссылку на вершину
Fragment
в стеке. Пример использования:источник
Я лично пробовал многие из этих решений и в итоге получил следующее рабочее решение:
Добавьте этот служебный метод, который будет использоваться несколько раз ниже, чтобы получить количество фрагментов в вашем backstack:
Затем, когда вы добавляете / заменяете свой фрагмент с помощью метода FragmentTransaction, сгенерируйте уникальный тег для вашего фрагмента (например: используя количество фрагментов в вашем стеке):
Наконец, вы можете найти любой из ваших фрагментов в своем backstack с помощью этого метода:
Следовательно, получить верхний фрагмент в backstack можно легко, вызвав:
Надеюсь это поможет!
источник
этот вспомогательный метод получает фрагмент из вершины стека:
источник
Котлин
источник
.lastOrNull()
еслиfragments
он пуст.В fragmentMananger есть список фрагментов. Имейте в виду, что удаление фрагмента не приводит к уменьшению размера списка (запись фрагмента просто становится нулевой). Следовательно, правильным решением будет:
источник
getFragments()
возвращает сокращенный набор фрагментов. Может, последний виден, но не многие другие.Ответ Deepak Goel не работает для меня, потому что я всегда получаю null от
entry.getName()
;Что я делаю, так это устанавливаю тег для фрагмента следующим образом:
Где ft - моя транзакция фрагмента, а
FRAGMENT_TAG
- тег. Затем я использую этот код для получения фрагмента:источник
Просто взял @roghayeh hosseini (правильный) ответ и сделал его в Котлине для тех, кто здесь, в 2017 году :)
* Это должно вызываться из Activity.
Наслаждаться :)
источник
вы можете использовать getBackStackEntryAt () . Чтобы узнать, сколько записей содержит активность в backstack, вы можете использовать getBackStackEntryCount ()
источник
Я добавлю кое-что к ответу Дипака Гоэла, поскольку многие люди, в том числе я, получали нуль, используя его метод. Видимо, чтобы тег работал, когда вы добавляете фрагмент в backstack, вы должны делать это так:
Вам нужно добавить один и тот же тег дважды.
Я бы прокомментировал, но у меня нет 50 репутации.
источник
Держите свой собственный стек обратно:
myBackStack
. КакAdd
фрагмент в свойFragmentManager
, также добавляйте его вmyBackStack
. ВonBackStackChanged()
поп,myBackStack
когда его длина больше, чемgetBackStackEntryCount
.источник
Похоже, что-то изменилось к лучшему, потому что приведенный ниже код отлично работает для меня, но я не нашел его в уже предоставленных ответах.
Котлин:
Ява:
источник
Если вы используете
addToBackStack()
, вы можете использовать следующий код.List<Fragment> fragments = fragmentManager.getFragments(); activeFragment = fragments.get(fragments.size() - 1);
источник
На самом деле в стек не добавляется последний фрагмент, потому что вы можете добавить несколько фрагментов в стек за одну транзакцию или просто удалить фрагменты без добавления нового.
Если вы действительно хотите иметь стек фрагментов и иметь возможность доступа к фрагменту по его индексу в стеке, вам лучше иметь уровень абстракции над
FragmentManager
стеком и его backstack. Вот как это сделать:Теперь вместо добавления и удаления фрагментов путем вызова
FragmentManager
напрямую, вы должны использоватьpush()
,replace()
иpop()
методыFragmentStackManager
. И вы сможете получить доступ к самому верхнему фрагменту, просто позвонивstack.get(stack.size() - 1)
.Но если вам нравятся хаки, у меня есть другие способы делать подобные вещи. Единственное, что я должен упомянуть, это то, что эти хаки будут работать только с фрагментами поддержки.
Первый способ - просто добавить все активные фрагменты в диспетчер фрагментов. Если вы просто замените фрагменты один за другим и вытащите их из стека, этот метод вернет самый верхний фрагмент:
Второй подход более хакерский и позволяет вам получить все фрагменты, добавленные в последней транзакции, для которой
addToBackStack
была вызвана:Обратите внимание, что в этом случае вы должны поместить этот класс в
android.support.v4.app
package.источник
Или вы можете просто добавить тег при добавлении фрагментов, соответствующих их содержимому, и использовать простое статическое поле String (также вы можете сохранить его в пакете экземпляров активности в методе onSaveInstanceState (Bundle)), чтобы сохранить последний добавленный тег фрагмента и получить этот фрагмент с помощьюTag () в любое время вам нужно ...
источник
Самый высокий ответ (Дипак Гоэль) мне не подошел. Как-то тег не был добавлен должным образом.
В итоге я просто отправил идентификатор фрагмента через поток (используя намерения) и получил его непосредственно из диспетчера фрагментов.
источник