您已假设
Fragment只要该应用程序仍在运行,该实例将一直存在。这是一个合理的假设,如果这个假设是正确的,那么您的方法将会很好地工作。
不幸的是,
Fragment当a
退回到后台时会被销毁,而在返回到前景时会重新创建。这就是为什么它看起来“刷新”的原因。并非如此
Activity。当
Activity后退到后台时,不会立即销毁它。而是将其在当前任务的后堆栈上保留一段时间,如果返回到前台,则它是
同一 实例。
为了解决这个问题,有四种不同的方法:
- 声明
FirstTime
为static
。这 应该 工作。我以前用过。但是,仅在绝对有必要保留成员字段的值的极端情况下,并且仅当没有其他方法可用时,才应使用此方法。生成变量static
会导致经典的内存泄漏。 - 保存的值
FirstTime
在您的Fragment
使用onSaveInstanceState()
:@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(“FirstTime”, FirstTime);
}
并在中检索值
onCreate():
@Overridepublic void onCreate (Bundle savedInstanceState){ super.onCreate(); FirstTime = savedInstanceState.getBoolean("FirstTime");}声明
FirstTime
一个全局常量类,而不是将其放在Fragment
:public class GlobalConstants{public static boolean FirstTime = true;// other global constants ...}
并以如下方式访问它
Fragment:
if (GlobalConstants.FirstTime) { GlobalConstants.FirstTime = false;} else { //Other stuff here cause it's not true}- 将的值保存在
FirstTime
中SharedPreference
:SharedPreferences sp = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean(“FirstTime”, FirstTime);
editor.commit();
并以这种方式获取其值:
SharedPreferences sp = getActivity().getPreferences(Context.MODE_PRIVATE);FirstTime = sp.getBoolean("FirstTime", true);前三个方法将
FirstTime在应用程序运行时保持值。第四种方法将保留
FirstTime超出应用程序生存期的值,即,当应用程序重新启动时,
FirstTime将是
true或
false取决于应用程序退出前最后设置的值。
参考文献:
1.
处理片段生命周期
。
2. 保存键值集 。
3. 可见性和生命周期 。
编辑:
要了解使用方法
onSaveInstanceState(),请参见以下链接:
1. 保存(和检索)Android实例状态 。
2.
一劳永逸,如何正确保存Fragments的实例状态 。
3. 处理配置更改 。
这 很 令人困惑,但是一旦您理解它就会对您有用。



