Фрагмент onResume() не вызывается, когда выталкивается из стопки

Привет, Я разрабатываю приложение для Android, в котором я использую. Я использую одиночные Activity и 3 фрагмента. Поэтому рассмотрим, что у меня есть 3 фрагмента AB C. Когда я переключаюсь с A на B, я добавляю Fragment к backstack и simillar для B в C. Теперь, когда я нажимаю Back от C, он показывает мне B и аналогичный для B to A as хорошо.

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

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

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

Ответы

Ответ 1

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;
}

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

Попробуйте изменить название на onCreateView() фрагмента.