Фрагмент 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()
фрагмента.