加载多个片段并将其添加到 android 中的后台堆栈
Load multiple fragment and adding it to backstack in android
我有 1 个 Activity
和 3 个 fragments
,它们分别是 FirstFragment
、SecondFragment
和 ThirdFragment
。
FirstFragment
在 MainActivity
打开时自动加载。
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();
}
我有 1 个 Activity
和 3 个 fragments
,它们分别是 FirstFragment
、SecondFragment
和 ThirdFragment
。
FirstFragment
在 MainActivity
打开时自动加载。
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();
}