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

标签 android android-fragments

假设我有一个Activity A,它有一个可以一次容纳一个 fragment 的 FrameLayout。假设当 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();

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

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

相关文章:

android - 当点击推送通知时,当应用程序关闭时,如何打开由 Firebase 发送的 url?

android - 对齐谷歌地图标记 fragment 中的文本

android - ViewPager中如何不刷新页面

android - 在不重新加载数据的情况下更新 viewpager 中的 fragment View

android - 离线 Android admob 广告

Android - 由于位置权限从设置中撤销而导致应用程序崩溃

未收到带有 Firebase 云消息传递的 Android 后台通知

android - fragment 在方向改变时被创建两次

android - 防止 Android 软键盘在 fragment 中向上移动 View ?

java - 如何将 Intent 发送到 gameView