gpt4 book ai didi

android - 在从后台恢复应用程序时显示相同的 fragment

转载 作者:行者123 更新时间:2023-11-29 20:55:38 26 4
gpt4 key购买 nike

例如,我有一个 Activity A,它有一个 FrameLayout,一次可以容纳一个 fragment 。可以说,当 Activity 首次启动时,它会将 Fragment A 加载到由 ListView 组成的 FrameLayout 中。当在 Fragment A 中选择一个项目时,它会启动 Fragment B。单击 Fragment B 上的项目会将您带到 Fragment C 。我目前这样做的方法是简单地隐藏 Fragment A,然后添加 Fragment B,因为这会保留 Fragment A 的 状态。我当然也将这个 fragment 交易添加到后台。

所以现在 Fragment A 存在于后台堆栈中。假设现在我回到我的 Android 主屏幕并转到另一个应用程序。当我这样做时,Android 系统决定销毁我的应用程序,因为系统需要更多内存。当我导航回我的应用程序时,我应该如何正确恢复用户离开应用程序的相同 fragment 。因此,如果用户在最小化应用程序时位于 Fragment C 上,并且当他从最小化的应用 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 是最后使用的 fragment (名称或其他)的实例。例如,您可以通过覆盖 fragment 的 onPause() 方法来更新此值。因此每个 fragment 的 onPause() 必须将 mCurrentFragment 设置为一个新值来标识 fragment 本身。

另一种方法可能是使用 SharedPreference。在每个 fragment 的 onPause() 中,设置:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
sp.edit().putInt(LAST_FRAGMENT, $int_identifying_your_fragment ).apply();

然后在你的 onCreate Activity 中,

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,但您可以引用您的 fragment 。

关于android - 在从后台恢复应用程序时显示相同的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27875802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com