在从后台恢复应用程序时显示相同的片段
Showing the same fragment on restoring the app from background
例如我有 Activity A
,它有一个 FrameLayout,一次可以容纳一个片段。可以说,当 Activity 首次启动时,它会将 Fragment A
加载到由 ListView 组成的 FrameLayout 中。当在 Fragment A
中选择一个项目时,它会启动 Fragment B
。单击 Fragment B
上的一个项目会将您带到 Fragment C
。我目前这样做的方法是简单地隐藏 Fragment A
然后添加 Fragment B
因为这会保留 Fragment A's
状态。我当然也在将这个片段交易添加到后台。
所以现在 Fragment A
存在于后台堆栈中。假设现在我返回 Android 主屏幕并转到另一个应用程序。当我这样做时,Android 系统决定销毁我的应用程序,因为系统需要更多内存。当我导航回我的应用程序时,如果用户在 Fragment C
最小化应用程序时以及从最小化的应用程序重新打开它时,我应该如何正确恢复用户离开 app.So 的相同片段Fragment A
加载。
您可以尝试覆盖 activity 中的 onSaveInstanceState()
和 onRestoreInstanceState()
方法(参见 here )。
static final String LAST_FRAGMENT = "userFragment";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt(LAST_FRAGMENT, mCurrentFragment);
super.onSaveInstanceState(savedInstanceState);
}
然后,在创建时,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mCurrentFragment = savedInstanceState.getInt(LAST_FRAGMENT);
}
else { mCurrentFragment = mDefaultFragment }
...
//then you need to load mCurrentFragment
此处 mCurrentFragment
是最后使用的片段(名称或其他)的实例。例如,您可以通过覆盖片段的 onPause()
方法来更新此值。因此每个片段的 onPause()
必须将 mCurrentFragment
设置为标识片段本身的新值。
另一种方法可能是使用SharedPreference
。在每个片段的onPause()中,设置:
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
sp.edit().putInt(LAST_FRAGMENT, $int_identifying_your_fragment ).apply();
然后在你的 activity onCreate 中,
static final String LAST_FRAGMENT = "userFragment";
static int mCurrentFragment;
static int mDefaultFragment = 0;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
mCurrentFragment = sp.getInt(LAST_FRAGMENT, mDefaultFragment);
...
/* then you load desired fragment according to mCurrentFragment
if (mCurrentFragment == 1), load fragment1 and so on */
我在这里使用了 int
s,但您可以引用您的片段。
例如我有 Activity A
,它有一个 FrameLayout,一次可以容纳一个片段。可以说,当 Activity 首次启动时,它会将 Fragment A
加载到由 ListView 组成的 FrameLayout 中。当在 Fragment A
中选择一个项目时,它会启动 Fragment B
。单击 Fragment B
上的一个项目会将您带到 Fragment C
。我目前这样做的方法是简单地隐藏 Fragment A
然后添加 Fragment B
因为这会保留 Fragment A's
状态。我当然也在将这个片段交易添加到后台。
所以现在 Fragment A
存在于后台堆栈中。假设现在我返回 Android 主屏幕并转到另一个应用程序。当我这样做时,Android 系统决定销毁我的应用程序,因为系统需要更多内存。当我导航回我的应用程序时,如果用户在 Fragment C
最小化应用程序时以及从最小化的应用程序重新打开它时,我应该如何正确恢复用户离开 app.So 的相同片段Fragment A
加载。
您可以尝试覆盖 activity 中的 onSaveInstanceState()
和 onRestoreInstanceState()
方法(参见 here )。
static final String LAST_FRAGMENT = "userFragment";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt(LAST_FRAGMENT, mCurrentFragment);
super.onSaveInstanceState(savedInstanceState);
}
然后,在创建时,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mCurrentFragment = savedInstanceState.getInt(LAST_FRAGMENT);
}
else { mCurrentFragment = mDefaultFragment }
...
//then you need to load mCurrentFragment
此处 mCurrentFragment
是最后使用的片段(名称或其他)的实例。例如,您可以通过覆盖片段的 onPause()
方法来更新此值。因此每个片段的 onPause()
必须将 mCurrentFragment
设置为标识片段本身的新值。
另一种方法可能是使用SharedPreference
。在每个片段的onPause()中,设置:
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
sp.edit().putInt(LAST_FRAGMENT, $int_identifying_your_fragment ).apply();
然后在你的 activity onCreate 中,
static final String LAST_FRAGMENT = "userFragment";
static int mCurrentFragment;
static int mDefaultFragment = 0;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
mCurrentFragment = sp.getInt(LAST_FRAGMENT, mDefaultFragment);
...
/* then you load desired fragment according to mCurrentFragment
if (mCurrentFragment == 1), load fragment1 and so on */
我在这里使用了 int
s,但您可以引用您的片段。