如何使用 sharedPreferences 编写正确的 if-else 语句?

How to write a correct if-else statement with sharedPreferences?

我在编写正确的 if-else 语句以使用复选框首选项更改动态壁纸的背景位图时遇到了一些麻烦。目前我调用了这个方法:

 public void setPreferences(SharedPreferences prefs) {
        //Introduce Preference Variables
        p = prefs;

        //Initialize Preference variables
        final boolean mySetting = PreferenceManager.getDefaultSharedPreferences(mContext)
.getBoolean(String.valueOf(R.string.touch), false);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putBoolean(String.valueOf(mySetting), false);
            editor.commit();

        //If statement to set preference value
        if (prefs.getBoolean(String.valueOf(mySetting), true)) {
            GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, nebula, 0);
        }else{
            GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, stars, 0);
        }


    }

其中 R.string.touch 是我 XML 文档中复选框首选项的关键,如下所示:

<CheckBoxPreference
    android:key="@string/touch"
    android:title=""
    android:summary=""
    android:defaultValue="false"/>

所以我的问题是如何编写正确的 if-else 语句甚至 switch-case 语句来切换背景位图?感谢您提供的任何帮助。

问题可能在于您访问 sharedPreferences 的方式。过去,当我使用共享首选项时,我使用了一种略有不同的方法:getActivity().getSharedPreferences()。在研究 PreferencManager.getDefault 偏好与 Context.getSharedPreferences 的对比时,我发现了这个 post。 Android getDefaultSharedPreferences 我会尝试更换

PreferenceManager.getDefaultPreferences(mContext);

mContext.getSharedPreferences("myAppPrefs", Context.MODE_PRIVATE);

其中 "myAppPrefs" 是任意键。

希望对您有所帮助。祝你好运!

我看到的一个问题是 String.valueOf(R.string.touch) 将给您一个整数作为字符串,而不是 strings.xml 中的字符串值。

这是您可以使用的另一种方法:

public void setPreferences() {
    final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
    final String key = mContext.getString(R.string.touch_setting_key);
    final boolean defaultValue = false;

    // Read setting's current value.
    final boolean currentValue = preferences.getBoolean(key, defaultValue);

    // Update setting to true.
    preferences.edit()
        .putBoolean(key, true)
        .apply();

    // Use new setting value in an if-statement
    final boolean newValue = preferences.getBoolean(key, defaultValue);

    if (newValue == true) {
        GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, nebula, 0);
    } else {
        GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, stars, 0);
    }
}

我假设您将密钥名称存储在 XML 中,如下所示:

<string translatable="false" name="touch_setting_key">touch_setting_key</string>

随着您在更多地方使用设置,您可以将 class 实例的首选项变量存储为 mPreferences 并从 onCreate() 初始化它。

您还可以在 XML 中存储默认值。对于布尔值,您可以这样做:

<item name="defaultTouchSetting" format="boolean" type="bool">true</item>

要从代码中读取它,您可以这样做:

final boolean defaultValue = mContext.getResources().getBoolean(R.bool.defaultTouchSetting);

让我知道您是否仍然卡在任何事情上。