3

What I need is exactly an onResume method (as it works for activities) for a specific fragment. I'm adding the fragment (let's say fragment A) to the back stack, and opening another fragment (fragment B) (again adding to back stack) from fragment A. I want to update toolbar when fragment B is closed and fragment A is on screen again. I expect onCreateView to get called but it's not getting called when I pop fragment B. I also tried adding an OnBackStackChangedListener to fragment A but then I cannot track which fragment is on the screen when the back stack changes.

So my question is how to make onCreateView get called when I turn back to fragment A. And if this is not a good practice, how else can I track this event?

Edit

I'm showing new fragments with this code:

getSupportFragmentManager().beginTransaction()
        .add(R.id.content, fragment)
        .addToBackStack(tag)
        .commit();

Should I change it somehow to make onCreateView get called? Since I'm adding new fragment B on existing fragment A (I can even click on a button which is in fragment A when B is on the screen), when I pop fragment B, nothing changes with fragment A's situation.

iamkaan
  • 1,495
  • 2
  • 23
  • 43

3 Answers3

1

Override this method in the Fragment and check the boolean value

   @Override
   public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        //Log.e("setUserVisibleHint", "isVisibleToUser " + isVisibleToUser);

   }

Put the code that you need to be executed whenever the fragment becomes visible/is hidden in this method, according to the isVisibleToUser boolean value

Kaloyan Roussev
  • 14,515
  • 21
  • 98
  • 180
  • I tried this but this method never gets called. I checked couple of other topics, people say this method should be used to inform system, and not to listen changes. – iamkaan Nov 10 '15 at 11:34
  • 1
    I have used it successfully in my application, this was the only solution that worked. I had a viewpager with fragments being swiped left and right, and only this method detected whenever a fragment was actually on screen or not. I dont know what else to propose to you, as other solutions didnt work out for me – Kaloyan Roussev Nov 10 '15 at 11:54
  • 1
    ViewPager might be calling this method automatically but since I don't use ViewPager in my app, probably I need something else. Thanks anyway! – iamkaan Nov 10 '15 at 11:57
  • @J.K. this method does not work unless fragment is used with ViewPager. – Mustansir Feb 22 '17 at 15:04
0

Did you try OnBackStackChangedListener this way?

public class BlankFragment2 extends Fragment {


    public BlankFragment2() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                if(getFragmentManager()==null)
                    return;
                Fragment fr = getFragmentManager().findFragmentById(R.id.container)//id of your container;

                if (fr instanceof BlankFragment2) {
                    //On resume code goes here
                }
            }
        });
        return inflater.inflate(R.layout.fragment_blank_fragment2, container, false);
    }
}
Tharindu Welagedara
  • 2,660
  • 18
  • 27
  • This does what I want but the way doesn't feel correct. I will keep searching but still, thanks a lot for help! – iamkaan Nov 10 '15 at 14:14
0

I hope this solution will works.

1) Put/call addOnBackStackChangedListener on your Activity

getSupportFragmentManager().addOnBackStackChangedListener(backStacklistener);

2) Define backStacklistener inside your Activity

FragmentManager.OnBackStackChangedListener backStacklistener = new FragmentManager.OnBackStackChangedListener() {
        public void onBackStackChanged() {
            FragmentManager manager = getSupportFragmentManager();
            if (manager != null) {
                Fragment fragment = manager.findFragmentById(R.id.fragment);
                if(fragment instanceof OutboxFragment) {
                    OutboxFragment currFrag = (OutboxFragment) fragment;
                    currFrag.onFragmentResume();
                }
            }
        }
    };

3) Provide a method on your fragment that you want to be triggered. In this case I create method named onFragmentResume()

public void onFragmentResume() {
    MainActivity activity = (MainActivity) getActivity();
    activity.showFab();
    // or do another thing here
}

Good luck!

azwar_akbar
  • 1,451
  • 18
  • 27