Fragment's onResume() not called when popped from backstack
Solution 1
onResume()
of the Fragment
is called only when the Activity
is resumed. So this wont help you. Even I'm facing similar issue right now. You can implement OnBackStackChangedListener
and get the fragment name in the top of the stack and set the ActionBar
title based on that.
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;
}
Solution 2
Try to use the replace
method instead add
on the FragmentTransaction
. This work for me:
FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();
Solution 3
As others have said already, onResume()
is only called when the activity itself is resumed, so that isn't going to help at all.
You need to check if you're adding a new fragment, or replacing an existing fragment in your fragment transaction:
If you
replace()
a previous fragment, that previous fragment will be recreated from scratch when you go back to it, soonCreateView()
will be called again, and you can update your toolbar title there. You probably do already.If you
add()
a new fragment, the previous fragment is still there, only not visible. When you go back to it, it's up to you to get the last entry from the back stack (usegetBackStackEntryCount()
andgetBackStackEntryAt()
in the fragment manager), get the corresponding Fragment object (usefindFragmentByTag()
in the fragment manager), cast that Fragment to some base class that all your fragments will inherit from, and call a custom method, e.g.onVisible()
, on that fragment. The default implementation ofonVisible()
in your base class does nothing. Override in each fragment to update toolbar title, FAB, and anything else as required. I'm also callingonVisible()
fromonResume()
to avoid code duplication.
Solution 4
you can use this method of fragment :
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
}
Solution 5
Put this code in your fragment.
@Override
public void setUserVisibleHint(boolean visible) {
super.setUserVisibleHint(visible);
if (visible && isResumed()) {
onResume();
}
}
@Override
public void onResume() {
super.onResume();
if (!getUserVisibleHint()) {
return;
}
setData();
}
Related videos on Youtube
nilkash
Updated on July 09, 2022Comments
-
nilkash almost 2 years
Hi I am developing android application in which I am using I am using single
Activity
and 3 fragments. So consider I have 3 fragments A B C. When I switch from A to B, I am addingFragment
to backstack and simillar for B to C. Now when I click back from C it shows me B and similar for B to A as well.But thing is that when I come from C to B or B to A, it's not calling
onResume()
or any other life cycle methods ofFragment
.What I want to do actually for every
Fragment
I have different title inActionBar
. So, in my code, when I move from A to B or B to c, I am changing activity title inside fragment. But when I click on back it not changing according to that.What is the actual problem? Why after pop from backstack its not calling
onResume()
for myFragment
? How do I solve this problem? Need Help. Thank you.-
LoveMeSomeFood over 10 yearsonResume() of the fragment is called only when the activity is resumed. So this wont help you. Even I'm facing similar issue right now. You can implement
OnBackStackChangedListener
and get the fragment name in the top of the stack and set the actionbar title based on that.
-
-
nilkash over 10 yearsBut when I pop up fragment from stack then it's not calling any life cycle method. Then what should I. thank you for help.
-
Harshit Rathi over 10 yearsYou need to change the title in onCreateView method of fragment. When you pop or add fragment to stack oncreateview method is called and then you set title according to your fragment class.
-
Franco about 10 years@HarshitRathi I tried this and as @nilkash said
onCreateView()
is not called when a fragment is popped from teh back stack and the new one becomes visible. -
RajV almost 8 yearsThis works. Probably should now be the accepted answer.
-
Zar E Ahmer almost 8 yearsThe fragments <b>onResume()</b> or onPause() will be called only when the Activities onResume() or onPause() is called. They are tightly coupled to the Activity. if you call replace onStop() will called.
-
Radu over 5 yearsThis is what I'm using too
-
Salut Amigo almost 4 yearsBut when I pop up fragment from stack then it's not calling this.
-
porya74 over 3 yearsThis is the Best answer. Trust me :)
-
Khawar Raza over 2 yearsReplacing the fragment will recreate the UI and execute the business logic written in onCreateView and onViewCreated methods. Be careful before using this approach.