it-roy-ru.com

OnResume () фрагмента не вызывается при извлечении из backstack

Привет я разрабатываю приложение для Android, в котором я использую, я использую один Activity и 3 фрагмента. Итак, учтите, что у меня есть 3 фрагмента A B C. Когда я переключаюсь с A на B, я добавляю Fragment в backstack и аналогичную для B к C. Теперь, когда я щелкаю обратно из C, он показывает мне B и аналогично для B к A.

Но дело в том, что когда я перехожу из C в B или B в A, он не вызывает onResume() или какие-либо другие методы жизненного цикла Fragment

Что я хочу сделать на самом деле для каждой Fragment У меня есть другой заголовок в ActionBar. Итак, в моем коде, когда я перехожу с A на B или B на c, я меняю заголовок действия внутри фрагмента. Но когда я нажимаю на спину, это не меняется в соответствии с этим.

В чем собственно проблема? Почему после удаления из backstack он не вызывает onResume() для моего Fragment? Как мне решить эту проблему? Нужна помощь. Спасибо.

17
nilkash

onResume()Fragment вызывается только при возобновлении Activity. Так что это тебе не поможет. Даже сейчас я сталкиваюсь с подобной проблемой. Вы можете реализовать OnBackStackChangedListener и получить имя фрагмента в верхней части стека и установить заголовок ActionBar на основе этого.

private FragmentManager.OnBackStackChangedListener getListener()
{
    FragmentManager.OnBackStackChangedListener result = new FragmentManager.OnBackStackChangedListener()
    {
        public void onBackStackChanged()
        {
            FragmentManager manager = getFragmentManager();

            if (manager != null)
            {
                if(manager.getBackStackEntryCount() >= 1){
                    String topOnStack = manager.getBackStackEntryAt(manager.getBackStackEntryCount()-1).getName();
                    Log.i("TOP ON BACK STACK",topOnStack);
                }
                }
            }
    };

    return result;
}
18
Uma

Попробуйте использовать метод replace вместо add в FragmentTransaction. Эта работа для меня:

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();
13
PedroDuran

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

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

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

  • Если вы add() новый фрагмент, предыдущий фрагмент все еще там, только не виден. Когда вы вернетесь к нему, вам нужно получить последнюю запись из заднего стека (используйте getBackStackEntryCount() и getBackStackEntryAt() в менеджере фрагментов), получить соответствующий объект Fragment (используйте findFragmentByTag() в менеджере фрагментов), привести этот фрагмент к некоторому базовый класс, от которого будут наследоваться все ваши фрагменты, и вызов пользовательского метода, например onVisible(), на этом фрагменте. Реализация по умолчанию onVisible() в вашем базовом классе ничего не делает. Переопределите в каждом фрагменте, чтобы обновить заголовок панели инструментов, FAB и все остальное, как требуется. Я также вызываю onVisible() из onResume(), чтобы избежать дублирования кода.

2
Eric Sellin

Поместите этот код в свой фрагмент.

@Override
public void setUserVisibleHint(boolean visible) {
        super.setUserVisibleHint(visible);
        if (visible && isResumed()) {
            onResume();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (!getUserVisibleHint()) {
            return;
        }
        setData();
    }
1
Amol Suryawanshi

вы можете использовать этот метод фрагмента:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
}
0
Mohammad Hadi