【问题标题】:Android Studio SharedPreferences of boolean and if conditionsAndroid Studio SharedPreferences 的 boolean 和 if 条件
【发布时间】:2016-03-17 17:40:34
【问题描述】:

任务: - 单击保存按钮时:将复选框的布尔值保存到 SharedPreferences。 - 在应用启动时检查 SharedPreferences 值是否为真,如果是,请选中复选框。

不确定我在上面的哪一部分错了,所以我向你展示了整个事情。 (在网上搜索了很多天并试图解决这个问题,请原谅新手城市)

MainActivity.java

public class MainActivity extends AppCompatActivity {
    boolean ever_saved_settings=false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String if_settings= String.valueOf(ever_saved_settings);
    if(if_settings.equals("true")) {
        SharedPreferences Saved_Settings = getPreferences(MODE_PRIVATE);
        String PU2 = Saved_Settings.getString("PU", null);
        if (PU2=="true")
            chk_box_PU.setChecked(true);
            else
            chk_box_PU.setChecked(false);

    }

public void save_settings(View v) {
    ever_saved_settings=true;
    CheckBox chk_box_PU = (CheckBox) findViewById(R.id.chk_box_PU);
    String PU_value = (String) chk_box_PU.getText();
    SharedPreferences Saved_Settings = this.getSharedPreferences("Saved_Settings", MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = Saved_Settings.edit();
    prefsEditor.putString("PU", PU_value);
    prefsEditor.commit();
}
}

编辑

这里是/xml,以防问题不在活动中。稀有但对新手来说可能:}

toolbar_save_button.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:orientation="horizontal">


<Button
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:text="@string/save_button"
    android:textSize="24dp"
    android:onClick="save_settings"/>

包含在: 主页.xml

<merge
xmlns:android="http://schemas.android.com/apk/res/android">
[...]
<include layout="@layout/toolbar_save_button"/>
</merge>

wish 包含在: activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="@drawable/back_0"
tools:context=".MainActivity">
[...]
<include layout="@layout/home"/>
[...]
</LinearLayout>

该按钮在安卓手机中运行 .apk 看起来很好,当你点击它时它“blibs”。

【问题讨论】:

  • 您曾经保存的设置在应用程序启动时将始终为假。
  • 你的问题 (PU2=="true")
  • 为什么需要将布尔值转换为字符串?

标签: java android checkbox sharedpreferences


【解决方案1】:

1.你不需要这个变量:

boolean ever_saved_settings=false;

每次启动应用程序时,此变量都会设置为 false。 如果设置不存在,您也不会收到任何错误,因此该变量是无用的。


2.您的线路

if (PU2=="true")

将始终返回 false。在这一行中,您比较的是指针,而不是值。

总是这样使用它:

if (PU2.equals("true"))


3. 为什么要将布尔值存储在字符串中,并将它们作为字符串进行比较?

可以比较布尔变量,例如:

boolean variable = true;
if (variable) {
    // do your stuff
}


4.您应该如何实现它:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SharedPreferences Saved_Settings = getSharedPreferences("Saved_Settings", MODE_PRIVATE);
    chk_box_PU.setChecked(Saved_Settings.getBoolean("PU", false));
}

public void save_settings(View v) {
    CheckBox chk_box_PU = (CheckBox) findViewById(R.id.chk_box_PU);

    SharedPreferences Saved_Settings = getSharedPreferences("Saved_Settings", MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = Saved_Settings.edit();

    prefsEditor.putBoolean("PU", chk_box_PU.isChecked());

    prefsEditor.apply();
}}

【讨论】:

  • 完美运行。感谢您对事物的评论,它也有助于学习:}
【解决方案2】:

试试这个:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    SharedPreferences Saved_Settings = getPreferences("Saved_Settings", MODE_PRIVATE);
    boolean PU2 = Saved_Settings.getBoolean("PU", false);

    // no need to check with if conditions. just set the button with the value(PU2)
    chk_box_PU.setChecked(PU2);

}

public void save_settings(View v) {
    CheckBox chk_box_PU = (CheckBox) findViewById(R.id.chk_box_PU);
    SharedPreferences Saved_Settings = this.getSharedPreferences("Saved_Settings", MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = Saved_Settings.edit();
    prefsEditor.putBoolean("PU", chk_box_PU.isChecked());
    prefsEditor.commit();
}

【讨论】:

  • 将 SharedPreferences get boolean 默认值替换为 false 就可以了。
【解决方案3】:

在你的 onCreate() 改变这个

SharedPreferences Saved_Settings = getPreferences(MODE_PRIVATE);

SharedPreferences Saved_Settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

这个if (PU2=="true")if(PU2.equals("true"))

【讨论】:

  • 没用。无论如何。我会尝试其他答案,我会编辑帖子以添加 .xml 以防万一......
【解决方案4】:

我认为您缺少首选项名称:

   SharedPreferences Saved_Settings = getPreferences(MODE_PRIVATE);

改为:

   SharedPreferences Saved_Settings = getPreferences("Saved_Settings", MODE_PRIVATE);

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 2012-08-03
    • 2018-09-26
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多