получить последний фрагмент в backstack - PullRequest
92 голосов
/ 14 марта 2012

Как я могу получить последний экземпляр фрагмента, добавленный в 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 ??

Ответы [ 14 ]

148 голосов
/ 20 марта 2012

Вы можете использовать getName() метод FragmentManager.BackStackEntry, который был представлен на уровне API 14. Этот метод вернет тег, который вы использовали при добавлении фрагмента в backstack с помощью addTobackStack(tag). * 1004. *

int index = getActivity().getFragmentManager().getBackStackEntryCount() - 1
FragmentManager.BackStackEntry backEntry = getFragmentManager().getBackStackEntryAt(index);
String tag = backEntry.getName();
Fragment fragment = getFragmentManager().findFragmentByTag(tag);

Вам нужно убедиться, что вы добавили фрагмент в backstack следующим образом:

fragmentTransaction.addToBackStack(tag);
48 голосов
/ 05 апреля 2014
FragmentManager.findFragmentById(fragmentsContainerId) 

функция возвращает ссылку на вершину Fragment в backstack. Пример использования:

    fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer);
            if(fr!=null){
                Log.e("fragment=", fr.getClass().getSimpleName());
            }
        }
    });
37 голосов
/ 20 января 2015

Я лично попробовал многие из этих решений и в итоге получил это рабочее решение:

Добавьте этот метод утилиты, который будет использоваться несколько раз ниже, чтобы получить количество фрагментов в вашем backstack:

protected int getFragmentCount() {
    return getSupportFragmentManager().getBackStackEntryCount();
}

Затем, когда вы добавляете / заменяете свой фрагмент, используя метод FragmentTransaction, генерируйте уникальный тег для вашего фрагмента (например, используя количество фрагментов в вашем стеке):

getSupportFragmentManager().beginTransaction().add(yourContainerId, yourFragment, Integer.toString(getFragmentCount()));

Наконец, выможете найти любой из ваших фрагментов в вашем backstack с помощью этого метода:

private Fragment getFragmentAt(int index) {
    return getFragmentCount() > 0 ? getSupportFragmentManager().findFragmentByTag(Integer.toString(index)) : null;
}

Таким образом, получить верхний фрагмент в вашем backstack можно легко, вызвав:

protected Fragment getCurrentFragment() {
    return getFragmentAt(getFragmentCount() - 1);
}

Надеюсь, это поможет!

6 голосов
/ 17 октября 2017

этот вспомогательный метод получает фрагмент из верхней части стека:

public Fragment getTopFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return getSupportFragmentManager().findFragmentByTag(fragmentTag);
}
6 голосов
/ 17 января 2016

Есть список фрагментов в фрагменте Мэненджера.Помните, что удаление фрагмента не приводит к уменьшению размера списка (запись фрагмента просто обнуляется).Следовательно, правильным решением будет:

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;
}
4 голосов
/ 30 октября 2012

Ответ, данный Дипаком Гоэлом, не работает для меня, потому что я всегда получаю ноль от entry.getName();

Что я делаю, так это устанавливаю тег для фрагмента:

ft.add(R.id.fragment_container, fragmentIn, FRAGMENT_TAG);

Где ft - моя транзакция фрагмента, а FRAGMENT_TAG - тег. Затем я использую этот код, чтобы получить фрагмент:

Fragment prev_fragment = fragmentManager.findFragmentByTag(FRAGMENT_TAG);
3 голосов
/ 14 марта 2012

вы можете использовать getBackStackEntryAt () .Чтобы узнать, сколько записей хранится в заднем стеке, вы можете использовать getBackStackEntryCount ()

int lastFragmentCount = getBackStackEntryCount() - 1;
2 голосов
/ 10 ноября 2018

Похоже, что-то изменилось в лучшую сторону, потому что приведенный ниже код отлично работает для меня, но я не нашел его в уже предоставленных ответах.

Котлин:

supportFragmentManager.fragments[supportFragmentManager.fragments.size - 1]

Java:

getSupportFragmentManager().getFragments()
.get(getSupportFragmentManager().getFragments().size() - 1)
2 голосов
/ 16 ноября 2017

Просто взял @roghayeh hosseini (правильный) ответ и сделал его в Котлине для тех, кто здесь в 2017 году:)

fun getTopFragment(): Fragment? {
    supportFragmentManager.run {
        return when (backStackEntryCount) {
            0 -> null
            else -> findFragmentByTag(getBackStackEntryAt(backStackEntryCount - 1).name)
        }
    }
}

* Это должно быть вызвано изнутри Действия.

Наслаждайтесь:)

2 голосов
/ 15 августа 2014

Держите свой собственный стек обратно: myBackStack.Когда вы Add добавите фрагмент к FragmentManager, также добавьте его к myBackStackonBackStackChanged() выскакивает из myBackStack, когда его длина превышает getBackStackEntryCount.

...