小编典典

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

java

每次显示时,我都试图booleanFragment类中使用a做某事Fragment

我的应用程序启动,打开FirstFragmentboolean首次永远true,那么我有一个if条款,检查它的价值:

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

然后,在第一次的时候FirstTimetrue,我做的东西一样去到另一个Fragment。当我回到自己的Fragment1身体上时onCreate(),我也会这样做。总是true似乎令人耳目一新。

然后,我认为这可能是问题Fragment,并且每次我按时Fragment1,它都会重新启动或发生某种情况。然后,我在我的容器中添加了一个吸气剂和吸气剂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,
}

但是,这仍然是真的。

我做错了什么还是我对片段的误解?
有什么办法吗?


阅读 260

收藏
2020-11-26

共1个答案

小编典典

您已假设Fragment只要该应用程序仍在运行,该实例将一直存在。这是一个合理的假设,如果这个假设是正确的,那么您的方法将会很好地工作。

不幸的是,Fragment当a
退回到后台时会被销毁,而在返回到前景时会重新创建。这就是为什么它看起来“刷新”的原因。并非如此Activity。当Activity后退到后台时,不会立即销毁它。而是将其在当前任务的后堆栈上保留一段时间,如果返回到前台,则它是
同一 实例。

为了解决这个问题,有四种不同的方法:

  • 声明FirstTimestatic。这 应该 工作。我以前用过。但是,仅在绝对有必要保留成员字段的值的极端情况下,并且仅当没有其他方法可用时,才应使用此方法。生成变量static会导致经典的内存泄漏。
  • 保存的值FirstTime在您的Fragment使用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
}
  • 将的值保存在FirstTimeSharedPreference
    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将是truefalse取决于应用程序退出前最后设置的值。

参考文献:

1.
处理片段生命周期

2. 保存键值集

3. 可见性和生命周期

编辑:

要了解使用方法onSaveInstanceState(),请参见以下链接:

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

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

3. 处理配置更改

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

2020-11-26