【问题标题】:Make CheckBoxPreference store a String ("true"/"false") instead of a Boolean in SharedPreferences使 CheckBoxPreference 在 SharedPreferences 中存储一个字符串(“true”/“false”)而不是布尔值
【发布时间】:2014-10-16 08:21:02
【问题描述】:

我有一个 PreferentFragment,其内容是从包含 CheckBoxPreference 的 .xml 文件加载的

    <CheckBoxPreference
          android:title="@string/pref_secure_conn"
          android:key="enable_secure_connection"
          android:defaultValue="false"/>

如您所知,当用户与此 Preference 交互时,SharedPreferences 对象会自动更新,以便 android:key 现在包含正确的布尔值。

但是,我想使用字符串而不是布尔值:有没有办法让 CheckBoxPreference 使用字符串值而不是布尔值,以便我以后可以使用该键调用 getString?

目前,我只是在听“onSharedPreferenceChanged”并手动更改它,但也许有更好的方法。 (另一个明显的解决方法是在需要此值时使用 getBoolean 而不是 getString,但假设我不能这样做)

【问题讨论】:

  • 是的,有更好的方法。而不是在调用 putBoolean 调用 putString 并将值解析为字符串时保存布尔值。你可以简单地做myboolean + "";
  • @PedroOliveira 我不调用 putBoolean 或 putString,因为这是由 Preference 自动完成的(我已经更新了问题,希望现在更清楚)
  • 查看preference.xml 文件并看到“true”和“false”字符串已按正常的xml 使用。但是您可以更改为 并自己实现该行为。

标签: android sharedpreferences checkboxpreference


【解决方案1】:

我能想到的最简单的方法是继承 CheckBoxPreference 并保存 Preference 冗余:

package com.example.preferencestest;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.CheckBoxPreference;
import android.util.AttributeSet;

public class StringCheckBoxPreference extends CheckBoxPreference {
    public StringCheckBoxPreference(Context context) { super(context); }
    public StringCheckBoxPreference(Context context, AttributeSet attrs) { super(context, attrs); }
    public StringCheckBoxPreference(Context context, AttributeSet attrs,
            int defStyle) { super(context, attrs, defStyle); }

    @Override
    public void setChecked(boolean checked) {
        super.setChecked(checked);
        SharedPreferences p = getSharedPreferences();
        SharedPreferences.Editor e = p.edit();
        e.putString(getKey()+"asString", String.valueOf(checked));
        e.apply();
    }
}

您可以像这样将此类添加到您的 PreferencesActivity xml 中:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <com.example.preferencestest.StringCheckBoxPreference
        android:defaultValue="true"
        android:key="myCheckBox"
        android:summary="@string/pref_description_social_recommendations"
        android:title="@string/pref_title_social_recommendations"
    />

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="example_checkbox"
        android:summary="@string/pref_description_social_recommendations"
        android:title="@string/pref_title_social_recommendations" />

【讨论】:

  • 这是我采取的方法。我不确定我的实现是比你的好还是差。你怎么看? (我对 Android 的经验非常有限)pastebin.com/rvEaAvXC
【解决方案2】:

当您保存SharedPreferences 时,您可以通过调用特定方法来指定它的类型,例如:

SharedPreferences.Editor.putBooleanSharedPreferences.Editor.putFloatSharedPreferences.Editor.putString

如果您调用putBoolean,该方法将期望一个布尔值作为第二个参数。然而,既然你想保存一个字符串,你应该调用putString。如果您的变量是布尔值,则需要将其更改为字符串。

恢复中:

    Boolean myBoolean = false;
    SharedPreferences sharedPref = ctx.getSharedPreferences(AppSettings.PREFERENCES_FILE, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("myBoolean, String.valueOf(myBoolean));
    editor.apply();

【讨论】:

  • 我没有调用任何这些方法,因为它是由 Preference 自动完成的。我已经更新了这个问题,所以它更清楚了。
  • 然后你必须自己实现它。检查grepcode.com/file_/repository.grepcode.com/java/ext/… 获取CheckBoxPreference 源代码并覆盖必要的方法
【解决方案3】:

这个怎么样:

    final String currentBooleanString = sharedPreferences.getString(
            KEY_PREF_CURRENT_BOOLEAN, "true");
    final CheckBoxPreference checkBoxPreference = new CheckBoxPreference(
            this);
    checkBoxPreference.setChecked(currentBooleanString.equals("true"));
    checkBoxPreference
            .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference,
                        Object newValue) {
                    if (!checkBoxPreference.isChecked()) {
                        sharedPreferences
                                .edit()
                                .putString(KEY_PREF_CURRENT_BOOLEAN,
                                        "false").commit();
                    } else {
                        sharedPreferences
                                .edit()
                                .putString(KEY_PREF_CURRENT_BOOLEAN,
                                        "true").commit();
                    }
                    return true;
                }
            });
    preferenceScreen.addPreference(checkBoxPreference);

其中“KEY_PREF_CURRENT_BOOLEAN”是用于将首选项保存在应用程序 SharedPreferences 中的键字符串。

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2018-03-10
    • 2011-12-28
    • 2011-04-27
    • 2019-08-16
    • 2022-11-08
    相关资源
    最近更新 更多