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



每次显示Fragment时,我都在尝试使用Fragment类中的boolean进行操作。

示例

我的应用启动,打开FirstFragment,第一次打开booleantrue,然后我有一个检查其值的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()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。

编辑:

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

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

2。

3。处理配置更改

IT 令人困惑的,但是一旦您理解它,它将对您有用。

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

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

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

最新更新