每次显示时,我都试图boolean在Fragment类中使用a做某事Fragment。
boolean
Fragment
我的应用程序启动,打开FirstFragment和boolean首次永远true,那么我有一个if条款,检查它的价值:
FirstFragment
true
if
if (FirstTime) { FirstTime = false; } else { // Other stuff here, cause it's not true. }
然后,在第一次的时候FirstTime是true,我做的东西一样去到另一个Fragment。当我回到自己的Fragment1身体上时onCreate(),我也会这样做。总是true似乎令人耳目一新。
FirstTime
Fragment1
onCreate()
然后,我认为这可能是问题Fragment,并且每次我按时Fragment1,它都会重新启动或发生某种情况。然后,我在我的容器中添加了一个吸气剂和吸气剂MainActivity:
MainActivity
public Boolean getFirstTime() { return FirstTime; } public void setFirstTime(Boolean FirstTime) { this.FirstTime = FirstTime; }
从开始就在哪里,然后我将代码从Fragment1for 更改为:
if (((MainActivity) getActivity()).getFirstTime()) ((MainActivity) getActivity()).setFirstTime(false); } else { // Other stuff here, cause it's not true, }
但是,这仍然是真的。
我做错了什么还是我对片段的误解? 有什么办法吗?
您已假设Fragment只要该应用程序仍在运行,该实例将一直存在。这是一个合理的假设,如果这个假设是正确的,那么您的方法将会很好地工作。
不幸的是,Fragment当a 退回到后台时会被销毁,而在返回到前景时会重新创建。这就是为什么它看起来“刷新”的原因。并非如此Activity。当Activity后退到后台时,不会立即销毁它。而是将其在当前任务的后堆栈上保留一段时间,如果返回到前台,则它是 同一 实例。
Activity
为了解决这个问题,有四种不同的方法:
static
onSaveInstanceState()
@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
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取决于应用程序退出前最后设置的值。
false
参考文献:
1. 处理片段生命周期 。
2. 保存键值集 。
3. 可见性和生命周期 。
编辑:
要了解使用方法onSaveInstanceState(),请参见以下链接:
1. 保存(和检索)Android实例状态 。
2. 一劳永逸,如何正确保存Fragments的实例状态 。
3. 处理配置更改 。
这 很 令人困惑,但是一旦您理解它就会对您有用。