Android – 在Fragment类中保存成员字段的值
每次显示Fragment
时,我都试图在Fragment
类中使用boolean
做一些事情。
例
我的应用程序启动,打开FirstFragment
并且第一次boolean
始终为true
,然后我有一个if
子句来检查它的值:
if (FirstTime) { FirstTime = false; } else { // Other stuff here, cause it's not true. }
然后,在第一次,当FirstTime
为true
,我做的事情就像去另一个Fragment
。 当我返回Fragment1
和onCreate()
,我也会这样做。 它总是true
,似乎它是令人耳目一新的东西。
然后我认为这可能是Fragment
一个问题,每次我按下Fragment1
,它都会重启或者什么的。 然后,我在MainActivity
添加了一个getter和setter:
public Boolean getFirstTime() { return FirstTime; } public void setFirstTime(Boolean FirstTime) { this.FirstTime = FirstTime; }
从开始以来,它是真的,然后,我从Fragment1
更改了我的代码:
if (((MainActivity) getActivity()).getFirstTime()) ((MainActivity) getActivity()).setFirstTime(false); } else { // Other stuff here, cause it's not true, }
但是,它仍然说这是真的。
我做错了什么或我误解了碎片?
有什么办法吗?
您假设只要应用程序处于活动状态, Fragment
实例仍然存在。 这是一个合理的假设,如果这个假设是正确的,你的方法就可以正常工作。
不幸的是, Fragment
在退回到背景中时会被破坏,并在它返回到前景时重新创建。 这就是为什么它似乎“刷新”。 Activity
也是如此。 当Activity
退回到后台时,它不会立即被销毁。 相反,它在当前任务的后台堆栈上维护了一段时间,如果它返回到前台,则它是同一个实例。
要解决这个问题,有四种不同的方法:
- 将
FirstTime
声明为static
。 这应该工作。 我之前用过这个。 但是,这只应在极端情况下使用,当绝对有必要保留成员字段的值时,并且仅在没有其他方法可用时才使用。 使变量static
导致经典的内存泄漏。 -
使用
onSaveInstanceState()
将FirstTime
的值保存在Fragment
:@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("FirstTime", FirstTime); }
并检索
onCreate()
的值:@Override public 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
超出应用程序生命周期的值,即当应用程序重新启动时, FirstTime
将为true
或false
具体取决于应用程序退出之前最后设置的值。
参考文献:
1. 处理片段生命周期 。
2. 保存键值集 。
3. 可见性和终身 。
编辑:
要了解如何使用onSaveInstanceState()
,请参阅以下链接:
1. 保存(和检索)Android实例状态 。
2. 一劳永逸,如何正确保存Fragments的实例状态 。
3. 处理配置更改 。
这很令人困惑,但一旦你理解它就会对你有用。
简单的解决方案,将您的布尔值设置为静态。
这当然不符合编程的良好实践。
为了更直接地回答你的问题,我假设片段和活动被破坏并创建新实例,因此布尔值再次设置为true。 因此,通过使变量成为静态,它的状态将保留在该类的所有实例中。