1

I am beginner in android and trying to develop an android app in which I stuck in back navigation. My issue is : How to manage backstack with activities and fragments.

A1 activity with frag1 calls A2 activity and A2 activity displays a user list where on click of a list to check user profile, call to A1 Activity with Frag 2.

On opening of Frag2 of A1 activity, We are using intent flag: flag_activity_reorder_to_front and adding frag1 to backstack with FragmentManager transaction

Now IF I click on back then It shows A1 Activity with frag1 instead of A2 Activity.

IF I don't add frag1 into backstack then on back, It works with first back but on second back it exits from the app.

Any suggestions?

K.K.Agarwal
  • 846
  • 5
  • 10

1 Answers1

0

Try using single activity and handle all fragment transactions in it using an interface. Activity should implement this interface. Example:

public interface FragChanger {
    int NEXT_FRAGHELLO =1;
    int NEXT_FRAGSET = 2;
    int NEXT_FRAGSELECT =3;
    int NEXT_FRAGLOG=4;
    int NEXT_FRAGCHAT=5;

    void onFragmentChange(int nextFrag);


}

The following should be in Your activity:

@Override
    public void onFragmentChange(int nextFrag) {

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();


        switch (nextFrag){
            case NEXT_FRAGHELLO:

                break;
            case NEXT_FRAGSET:
                 FragSet fragSet = new FragSet();

                ft.replace(containerId,fragSet,"fragset");
                ft.addToBackStack(null);
                ft.commit();

                break;
            case NEXT_FRAGSELECT:
                FragSelect fragSelect = new FragSelect();

                ft.replace(containerId,fragSelect,"fragselect");
                ft.addToBackStack(null);
                ft.commit();
                break;
            case NEXT_FRAGCHAT:
                FragChat fragChat = new FragChat();
                ft.replace(containerId,fragChat,"fragchat");
                ft.addToBackStack(null);
                ft.commit();}
                break;

            case NEXT_FRAGLOG:

                ft.replace(containerId,fragLog,"fraglog");
                ft.addToBackStack(null);
                ft.commit();
                break;
}

Handling back in your activity:

@Override
    public void onBackPressed() {
        Log.d(TAG,"button back pressed");
       //Check which fragment is displayed an do whatever you need
       //for example like this
if (getSupportFragmentManager().findFragmentById(containerId) instanceof FragLog){
        Fragment fl =  getSupportFragmentManager().findFragmentByTag("fraglog");
        if (fl !=null){
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();

            ft.remove(fl);
            ft.commit();
            return;
        }
        }


    }

Of course, this is only an example, but may be useful in Your case

Pavel B.
  • 805
  • 10
  • 13