android fragment状态保存,保存和恢复 Android Fragment 的状态

本文详细讨论了Android Fragment中状态保存的问题,包括屏幕旋转、后退栈中的Fragment以及多个Fragment旋转屏幕的情况。作者提供了模板代码,演示如何在onSaveInstanceState、onDestroyView和onActivityCreated中保存和恢复Fragment的状态,以确保UI状态正确处理。此外,文章还提醒了避免使用setRetainInstance(true)的原因,并推荐了一个方便使用的库来简化状态管理。
摘要由CSDN通过智能技术生成

更新

更新

@bhfo

要在构造函数中,加上

if (getArguments() == null)

setArguments(new Bundle());

原文翻译

经过几年在 Android 应用开发中应用 Fragment 的努力之后,我必须要说尽管Fragment的概念非常优秀,但是它也同时带来了一堆问题。当我们处理实例的状态保存时就需要特别一件一件地修护好。

首先,尽管已经有了一个类似 Activity 中的 onSaveInstanceState 方法,但是它显然不能覆盖所有情况。换种说法就是,你不能仅仅依赖于 onSaveInstanceState 方法来保存/恢复视图的状态。这里有一些案例研究。

案例1:只有一个 Fragment 在栈中时,旋转屏幕

75dc2f51cd63

案例1

屏幕旋转是用来测试实例状态的保存/恢复的最简单的案例。这种情况很容易处理,你仅仅需要简单地保存一些东西,比如:成员变量,它也会在屏幕旋转时在 onSaveInstanceState 丢失,在 onActivityCreated 或者 onViewStateRestored 中恢复,如下所示:

int someVar;

@Override

protected void onSaveInstanceState(Bundle outState) {

outState.putInt("someVar", someVar);

outState.putString(“text”, tv1.getText().toString());

}

@Override

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

someVar = savedInstanceState.getInt("someVar", 0);

tv1.setText(savedInstanceState.getString(“text”));

}

看上去是不是很好?不过也不是全不管用。这种情况是在 onSaveInstanceState 不被回调,但是视图重新生成。这意味着什么?UI 里的所有东西都没了。下面就是这种案例。

案例2:后退栈(Back Stack)中的 Fragment

75dc2f51cd63

案例2

当一个 fragment 从后退栈中返回时(Fragment A就是在这种情况),Fragment A 中视图将会遵循下图的 Fragment 生命周期被重新创造出来。

75dc2f51cd63

Fragment 生命周期

你将会看到Fragment从后退栈中返回时,会回调 onDestroyview 方法和 onCreateview 方法。不管怎样,显然在这种情况 onSaveInstanceStat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值