【问题标题】:Load multiple fragment and adding it to backstack in android加载多个片段并将其添加到android中的backstack
【发布时间】:2016-06-06 05:36:10
【问题描述】:

我有 1 个Activity 和 3 个fragments,它们分别是FirstFragment、SecondFragment 和ThirdFragment。

FirstFragment 在MainActivity 打开时自动加载。 SecondFragment 通过带有addToBackStack 标志的FirstFragment 的按钮单击加载。 ThirdFragment 也是如此。

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

如何做到这一点?

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

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。

任何建议或帮助将不胜感激。提前致谢。

【问题讨论】:

  • 尝试将 android:alwaysRetainTaskState="true" 添加到 Manifest 中 MainActivity 的活动标签中
  • 关闭应用是什么意思...杀了它再回来?

标签: android android-fragments fragment-backstack


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2014-09-26
    相关资源
    最近更新 更多