Fragment's onResume() not called when popped from backstack

杀马特。学长 韩版系。学妹 提交于 2019-12-03 15:33:26

问题


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 adding Fragment 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 of Fragment.

What I want to do actually for every Fragment I have different title in ActionBar. 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 my Fragment? How do I solve this problem? Need Help. Thank you.


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



回答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();



回答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, so onCreateView() 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 (use getBackStackEntryCount() and getBackStackEntryAt() in the fragment manager), get the corresponding Fragment object (use findFragmentByTag() 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 of onVisible() in your base class does nothing. Override in each fragment to update toolbar title, FAB, and anything else as required. I'm also calling onVisible() from onResume() to avoid code duplication.




回答4:


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



回答5:


you can use this method of fragment :

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



回答6:


I use this way, add this block code in your fragment

requireActivity().supportFragmentManager.addOnBackStackChangedListener {
            val fm = requireActivity().supportFragmentManager
            fm?.let {
                if (it.backStackEntryCount == YOUR_FRAGMENT_BACK_STACK_INDEX) {
                    // your fragment visible
                }
            }
        }



回答7:


Try to change title on onCreateView() of Fragment.



来源:https://stackoverflow.com/questions/19395955/fragments-onresume-not-called-when-popped-from-backstack

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!