androidandroid-fragmentsfragment-backstack

Load multiple fragment and adding it to backstack in android


I have 1 Activity and 3 fragments they're FirstFragment, SecondFragment & ThirdFragment respectively.

FirstFragment loads automatically when MainActivity is open. SecondFragment loads by Button click of FirstFragment with addToBackStack flag. same thing goes with ThirdFragment.

Now, suppose user closes the app when SecondFragment is displaying on its screen, than when user opens the app again, he should directly switch to SecondFragment (internally FirstFragment loads than SecondFragment loads with addToBacStack flag).

How to achieve this?

Here's some code. currently, I'm unable to load multiple fragment.

SharePreferences for current displaying fragment.

public class PrefsMain {

    public static final String TAG = Prefs.class.getSimpleName();

    // Strings contains Fragment names BEGIN
    public static final String CurrentFragment_RoleSelectionFragment =
            RoleSelectionFragment.TAG;
    public static final String CurrentFragment_CheckInOutFragment =
            CheckInOutFragment.TAG;
    public static final String CurrentFragment_TeacherRegFragment =
            TeacherRegFragment.TAG;
    public static final String CurrentFragment_StudentSelectionFragment =
            StudentSelectionFragment.TAG;
    public static final String CurrentFragment_StudentFragment =
            StudentFragment.TAG;
    public static final String CurrentFragment_StudentRegistrationFragment =
            StudentRegistrationFragment.TAG;
    public static final String CurrentFragment_DiagnoseFragment =
            DiagnoseFragment.TAG;
    // Strings contains Fragment names END

    // SharedPreferences KEY
    private static final String CurrentFragment = "Fragment";

    private SharedPreferences mPrefs;

    public PrefsMain(Context context) {
        mPrefs = context.getSharedPreferences(TAG, Context.MODE_PRIVATE);
    }

    // Getter - Setter
    public String getCurrentFragment() {
        return mPrefs.getString(CurrentFragment, CurrentFragment_RoleSelectionFragment);
    }

    public void setCurrentFragment(String currentFragment) {
        mPrefs.edit().putString(CurrentFragment, currentFragment).apply();
    }
}

MainAvtivity.java

import static com.odoo.addons.employees.utils.PrefsMain.CurrentFragment_CheckInOutFragment;
import static com.odoo.addons.employees.utils.PrefsMain.CurrentFragment_DiagnoseFragment;
import static com.odoo.addons.employees.utils.PrefsMain.CurrentFragment_RoleSelectionFragment;
import static com.odoo.addons.employees.utils.PrefsMain.CurrentFragment_StudentFragment;
import static com.odoo.addons.employees.utils.PrefsMain.CurrentFragment_StudentRegistrationFragment;
import static com.odoo.addons.employees.utils.PrefsMain.CurrentFragment_StudentSelectionFragment;
import static com.odoo.addons.employees.utils.PrefsMain.CurrentFragment_TeacherRegFragment;

public class MainActivity extends AppCompatActivity {

    public static final String TAG = MainActivity.class.getSimpleName();

    private PrefsMain mPrefsMain;
    private AppCompatActivity mActivity;

    private RoleSelectionFragment mRoleSelectionFragment;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mActivity = this;
        mPrefsMain = new PrefsMain(this);
    }

    @Override
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        // simply get the fragment name from `SharedPreferences`.
        // and loads it 
        final String currentFragment = mPrefsMain.getCurrentFragment();
        if (currentFragment.equals(CurrentFragment_RoleSelectionFragment)) {
            loadFragment(RoleSelectionFragment.newInstance(), 
                            RoleSelectionFragment.TAG);
        } else if (currentFragment.equals(CurrentFragment_CheckInOutFragment)) {
            loadFragment(CheckInOutFragment.newInstance(), 
                            CheckInOutFragment.TAG);
        } else if (currentFragment.equals(CurrentFragment_TeacherRegFragment)) {
            loadFragment(TeacherRegFragment.newInstance(), 
                            TeacherRegFragment.TAG);
        } else if (currentFragment.equals(CurrentFragment_StudentSelectionFragment)) {
            loadFragment(StudentSelectionFragment.newInstance(), 
                            StudentSelectionFragment.TAG);
        } else if (currentFragment.equals(CurrentFragment_StudentFragment)) {
            loadFragment(StudentFragment.newInstance(), 
                            StudentFragment.TAG);
        } else if (currentFragment.equals(CurrentFragment_StudentRegistrationFragment)) {
            loadFragment(StudentRegistrationFragment.newInstance(), 
                            StudentRegistrationFragment.TAG);
        } else if (currentFragment.equals(CurrentFragment_DiagnoseFragment)) {
            loadFragment(DiagnoseFragment.newInstance(), 
                            DiagnoseFragment.TAG);
        }
    }

    public void loadFragment(Fragment fragment, String TAG) {
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.flMain, fragment, TAG)
                .commit();
    }
}

<br/ ><br/ > Above implementation just loads the last known fragment but, it doesn't perform addToBackStack for its parent fragments.


Solution

  • You are not adding the transaction to backstack. Add your transaction to backstack.

    public void loadFragment(Fragment fragment, String TAG) {
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.flMain, fragment, TAG)
                .addToBackStack(TAG)
                .commit();
    }