Android 在从后台还原应用程序时显示相同的片段
比如说,我有一个Android 在从后台还原应用程序时显示相同的片段,android,android-fragments,Android,Android Fragments,比如说,我有一个活动A,它有一个框架布局,一次可以容纳一个片段。假设当活动第一次启动时,它会将片段A加载到由ListView组成的FrameLayout中。当在片段A中选择一个项目时,它会启动片段B。单击片段B上的一个项目会将您带到片段C。我目前做这件事的方法是,简单地隐藏片段A,然后添加片段B,因为这样可以保留片段A的状态。我当然也将这个片段事务添加到backback中 所以现在片段A存在于backbackback上。假设现在我回到我的Android主屏幕并转到另一个应用程序。当我这么做时,A
活动A
,它有一个框架布局,一次可以容纳一个片段。假设当活动第一次启动时,它会将片段A
加载到由ListView组成的FrameLayout中。当在片段A
中选择一个项目时,它会启动片段B
。单击片段B
上的一个项目会将您带到片段C
。我目前做这件事的方法是,简单地隐藏片段A
,然后添加片段B
,因为这样可以保留片段A的状态。我当然也将这个片段事务添加到backback中
所以现在片段A
存在于backbackback上。假设现在我回到我的Android主屏幕并转到另一个应用程序。当我这么做时,Android系统决定销毁我的应用程序,因为系统需要更多内存。当我导航回我的应用程序时,我应该如何正确地恢复用户离开应用程序的相同片段。因此,如果用户在最小化应用程序时打开了fragment C
,并且当他从最小化应用程序重新打开时fragment A
加载。您可以尝试覆盖onSaveInstanceState()
和onRestoreInstanceState()
方法(请参阅)
然后在创作的时候,
@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
设置为一个新值,以标识片段本身
另一种方法是使用SharedReference
。在每个片段的onPause()中,设置:
然后在您的活动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,但是您可以引用您的片段 我一定会尝试一下,然后再给你们回复。出于好奇,你们使用了这两种方法中的哪一种?savedInstanceState或SharedReference?前一个…因为我需要为我正在存储的相应代码片段存储一些参数。现在我们有了PersistentBundle
。关于我如何在应用程序中有效使用它的任何线索。嘿…只是一个简单的建议…将数据保存在片段本身的onSaveInstance
中,而不是将变量传递给主活动并将值保存在那里。
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
sp.edit().putInt(LAST_FRAGMENT, $int_identifying_your_fragment ).apply();
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 */