0

My app has this flow

Activity (TabLayout) -> Fragment 1 -> Fragment 2 -> Fragment 3

When I either press back on Fragment 2 or Fragment 3, I already go back to Fragment 1. I want to go back to Fragment 2 if I am on Fragment 3.

From fragment 1 to fragment 2

Frag2 childFrag = new Frag2();
getChildFragmentManager().beginTransaction().add(R.id.frag2_frame, childFrag)
    .addToBackStack(null)
    .commit(); 

From fragment 2 to fragment 3

Frag3 childFrag = new Frag3();
getChildFragmentManager().beginTransaction().add(R.id.frag3_frame, childFrag)
    .addToBackStack(null)
    .commit(); 

onBackPressed in Activity

// a fragments list for tablayout
ArrayList<Fragment> fragments = new ArrayList<>();    

public void onBackPressed(){
    fragments.get(selectedTab).getChildFragmentManager().popBackStack();
}
Pak Ho Cheung
  • 1,382
  • 6
  • 22
  • 52

3 Answers3

0

Try adding backStack

Frag2 childFrag = new Frag2();
getFragmentManager().beginTransaction().add(R.id.frag2_frame, childFrag)
    .addToBackStack("Frag2 ")
    .commit(); 
Deˣ
  • 4,191
  • 15
  • 24
0

Once fragment 1 is added to the Activity, I believe you'll need to use getChildFragmentManager() to add additional fragments from a fragment. This method is available to classes that extend a Fragment.


Edit


As you've said you are using getChildFragmentManager(), I would use .beginTransaction().replace(...) instead of .beginTransaction().add(...).

Charlie
  • 2,876
  • 19
  • 26
0

Try to find the deepest fragment. Then popBackStack right there.

List<Fragment> fs2 = fragments.get(selectedTab).getChildFragmentManager().getFragments().get(0).getChildFragmentManager().getFragments();
FragmentManager f = fragments.get(selectedTab).getChildFragmentManager();
while (fs2.size() > 0) {
    fs2 = fs2.get(0).getChildFragmentManager().getFragments();
    f = f.getFragments().get(0).getChildFragmentManager();
}
f.popBackStack();
Pak Ho Cheung
  • 1,382
  • 6
  • 22
  • 52