Как получить текущий фрагмент из MainActivity

Я провел некоторое исследование, но я действительно не мог найти ответ.

У меня есть одно действие с боковым меню и держателем. У меня есть много (неподдерживаемых) фрагментов, и все они используют один и тот же держатель (по одному).

Когда пользователь использует меню (оно находится в основном действии) и переходит на другую страницу, я хочу добавить имя текущего фрагмента в стопку (используя .addToBackStack(Fragment1.class.getName())), но я не смог найти, как получить текущий фрагмент.

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


person Mohamed    schedule 21.07.2017    source источник


Ответы (5)


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

if (getFragmentManager().getBackStackEntryCount() > 1) {
            Fragment f = getFragmentManager().findFragmentById(R.id.content_frame);
            if (f instanceof BlankFragment) {
                // Do something
            }
}
person AndroidGeek    schedule 21.07.2017

OK,

Если вы хотите получить последнюю запись из бэкстека (спасибо @AndroidGeek);

fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-1);

и, если вы хотите получить текущий активный фрагмент (спасибо @Salman500 @AndroidGeek);

Fragment f = getFragmentManager().findFragmentById(R.id.fragment_holder);
person Mohamed    schedule 21.07.2017

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

Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment_id);

    if(fragment!=null)
    {
        getFragmentManager()
                .beginTransaction()
                .addToBackStack(null)
                .commit();
    }
person Salman500    schedule 21.07.2017

Вы можете отслеживать фрагменты в основной активности (с переменными) и получать к ним доступ там. Пример:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();

MyFragment myFragment = new MyFragment();

myFragment.doSomething();

Добавление в задний стек:

FragmentTransaction fragment = getSupportFragmentManager().beginTransaction();
fragment.addToBackStack(fragment);
fragment.commit();

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

person escapesequence    schedule 21.07.2017
comment
Проблема в том, что я не использую библиотеку поддержки, поэтому SupportFragmentManager. Могу ли я использовать его без использования фрагмента поддержки? - person Mohamed; 22.07.2017

Просто используйте addToBackStack() перед commit() транзакцией фрагмента. см. здесь

Таким образом, ваш код будет выглядеть так:

...
fragmentTransaction.replace(R.id.holder, newFragmentToShow, newFragmentTag);
fragmentTransaction.addToBackStack();
fragmentTransaction.commit();
...

EDIT: после редактирования OP

Вам не нужен класс фрагмента для вызова addToBackStack(), как вы упомянули в ОП. Аргумент String — необязательная строка, предназначенная только для сохранения состояния обратного стека. Вы должны увидеть документацию.

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

person zeekhuge    schedule 21.07.2017
comment
Вопрос в том, как я могу получить текущий фрагмент (или его имя класса), который активен, из основного действия. - person Mohamed; 22.07.2017
comment
Основная активность та, которая заменяет фрагмент. не так ли? поэтому основная активность должна уже знать, какой фрагмент она отображает (используйте одну переменную, вот и все). Что касается добавления в стек, вам просто нужно использовать addToBackStack() перед заменой текущего фрагмента на новый. - person zeekhuge; 22.07.2017
comment
Меню — не единственное место, где я заменяю фрагменты. Его можно было изменить изнутри фрагментов. Я знаю про вторую часть. - person Mohamed; 22.07.2017
comment
Отредактировал ответ. - person zeekhuge; 22.07.2017
comment
Спасибо за предложение, но, как я уже сказал, я не хочу следить за этим сам. Я тоже знаю, как это работает. Это стек, и я хочу получить только тот, который находится наверху, как .pop() - person Mohamed; 22.07.2017