每次显示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()
在Fragment
中保存FirstTime
的值:@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 }
-
在
SharedPreference
中保存FirstTime
的值: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
或CC_37,具体取决于其上次设置的APP撤离之前的值。
参考:
1。处理片段生命周期。
2。保存键值设置。
3。 编辑: 了解如何使用 1。保存(和检索)Android实例状态。 2。 3。处理配置更改。 IT 是令人困惑的,但是一旦您理解它,它将对您有用。onSaveInstanceState()
,请参阅以下链接:
简单解决方案,将布尔值设置为静态。
当然,这不符合编程的良好实践。
要更直接地回答您的问题,我假设碎片和活动被破坏并创建了新的实例,因此布尔被设置为真实。因此,通过使变量静态,它的状态将在该类的所有实例中保留。