Android – 在Fragment类中保存成员字段的值

每次显示Fragment时,我都试图在Fragment类中使用boolean做一些事情。

我的应用程序启动,打开FirstFragment并且第一次boolean始终为true ,然后我有一个if子句来检查它的值:

 if (FirstTime) { FirstTime = false; } else { // Other stuff here, cause it's not true. } 

然后,在第一次,当FirstTimetrue ,我做的事情就像去另一个Fragment 。 当我返回Fragment1onCreate() ,我也会这样做。 它总是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将为truefalse具体取决于应用程序退出之前最后设置的值。

参考文献:

1. 处理片段生命周期

2. 保存键值集

3. 可见性和终身

编辑:

要了解如何使用onSaveInstanceState() ,请参阅以下链接:

1. 保存(和检索)Android实例状态

2. 一劳永逸,如何正确保存Fragments的实例状态

3. 处理配置更改

令人困惑,但一旦你理解它就会对你有用。

简单的解决方案,将您的布尔值设置为静态。

这当然不符合编程的良好实践。

为了更直接地回答你的问题,我假设片段和活动被破坏并创建新实例,因此布尔值再次设置为true。 因此,通过使变量成为静态,它的状态将保留在该类的所有实例中。