从后台恢复应用程序时显示相同的片段

时间:2015-01-10 11:37:43

标签: android android-fragments

比方说我有Activity A,它有一个FrameLayout,一次可以容纳一个片段。让我们说,当Activity首次启动时,它会将Fragment A加载到FrameLayout中,它由ListView组成。在Fragment A中选择某个项目时,它会启动Fragment B。点击Fragment B上的项目会转到Fragment C。我目前这样做的方法是隐藏Fragment A,然后添加Fragment B,因为这会保留Fragment A's状态。我当然也将这个片段事务添加到backstack。

所以现在backstack上存在Fragment A。现在说我回到我的Android主屏幕并转到另一个应用程序。当我这样做时,Android系统决定销毁我的应用程序,因为系统需要更多内存。当我导航回我的应用程序时,我应该如何正确地恢复用户离开app的相同片段。如果用户在最小化应用程序时在Fragment C上,并且当他从最小化应用程序{{}重新打开它时1}}加载。

1 个答案:

答案 0 :(得分:2)

您可以尝试覆盖活动中的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();

然后在你的活动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,但你可以参考你的片段。