加载多个片段并将其添加到 android 中的后台堆栈

Load multiple fragment and adding it to backstack in android

我有 1 个 Activity 和 3 个 fragments,它们分别是 FirstFragmentSecondFragmentThirdFragment

FirstFragmentMainActivity 打开时自动加载。 SecondFragment 通过点击带有 addToBackStack 标志的 FirstFragment 按钮加载。同样的事情也发生在 ThirdFragment.

现在,假设用户在屏幕上显示 SecondFragment 时关闭应用程序,然后当用户再次打开应用程序时,他应该直接切换到 SecondFragment(内部 FirstFragment 加载比 SecondFragment 加载 addToBacStack 标志)。

如何实现?

这是一些代码。目前,我无法加载多个片段。

SharePreferences 当前显示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();
    }
}

上面的实现只是加载最后一个已知的 fragment 但是,它不会为其父 fragments.

执行 addToBackStack

如有任何建议或帮助,我们将不胜感激。提前致谢。

您没有将事务添加到后台堆栈。将您的交易添加到 backstack。

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