Как я могу получить последний экземпляр фрагмента, добавленный в 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 ??
Вы можете использовать метод getName() для FragmentManager.BackStackEntry, который был представлен на уровне API 14. Этот метод вернет тег, который вы использовали, когда добавляли фрагмент в стопку с помощью addTobackStack(tag).
int index = getActivity().getFragmentManager().getBackStackEntryCount() - 1
FragmentManager.BackStackEntry backEntry = getFragmentManager().getBackStackEntryAt(index);
String tag = backEntry.getName();
Fragment fragment = getFragmentManager().findFragmentByTag(tag);
Вам нужно убедиться, что вы добавили фрагмент в стопку следующим образом:
функция возвращает ссылку на начало Fragment в стопке. Пример использования:
fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer);
if(fr!=null){
Log.e("fragment=", fr.getClass().getSimpleName());
}
}
});
Ответ 3 · рейтинг 43 · ptitvinou
Я лично пробовал многие из этих решений и в итоге получил это рабочее решение:
Добавьте этот служебный метод, который будет использоваться несколько раз ниже, чтобы получить количество фрагментов в вашем backstack:
protected int getFragmentCount() {
return getSupportFragmentManager().getBackStackEntryCount();
}
Затем, когда вы добавляете/заменяете свой фрагмент с помощью метода FragmentTransaction, сгенерируйте уникальный тег для вашего фрагмента (например, используя количество фрагментов в вашем стеке):
Таким образом, получить верхний фрагмент в вашем стеке можно легко, вызвав:
protected Fragment getCurrentFragment() {
return getFragmentAt(getFragmentCount() - 1);
}
Надеюсь это поможет!
Ответ 4 · рейтинг 14 · The Finest Artist
Котлин
// In activities
activity.supportFragmentManager.fragments.lastOrNull()
// In fragments
fragment.childFragmentManager.fragments.lastOrNull()
Ответ 5 · рейтинг 11 · roghayeh hosseini
этот вспомогательный метод получает фрагмент из вершины стека:
public Fragment getTopFragment() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return getSupportFragmentManager().findFragmentByTag(fragmentTag);
}
Ответ 6 · рейтинг 6 · Erez
В менеджере фрагментов есть список фрагментов. Имейте в виду, что удаление фрагмента не приводит к уменьшению размера списка (запись фрагмента просто становится нулевой). Поэтому правильным решением будет:
public Fragment getTopFragment() {
List<Fragment> fragentList = fragmentManager.getFragments();
Fragment top = null;
for (int i = fragentList.size() -1; i>=0 ; i--) {
top = (Fragment) fragentList.get(i);
if (top != null) {
return top;
}
}
return top;
}
Ответ 7 · рейтинг 5 · Eduardo
Ответ, данный Deepak Goel, не работает для меня, потому что я всегда получаю null от entry.getName();
Что я делаю, так это устанавливаю тег для фрагмента следующим образом:
Я добавлю кое-что к Deepak Goel answer, так как многие люди, включая меня, получали нуль, используя его метод. По-видимому, чтобы заставить тег работать, когда вы добавляете фрагмент в стопку, вы должны делать это следующим образом:
Я бы прокомментировал, но у меня нет репутации 50.
Ответ 12 · рейтинг 2 · Arne Evertsson
Держите свой собственный задний стек: myBackStack. Поскольку вы Add добавляете фрагмент к FragmentManager, добавьте его и к myBackStack. В onBackStackChanged() извлекается из myBackStack, когда его длина превышает getBackStackEntryCount.