使CheckBoxPreference存储一个字符串(" true" /" false")而不是SharedPreferences中的布尔值

时间:2014-10-16 08:21:02

标签: android sharedpreferences checkboxpreference

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

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

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

但是,我想使用String而不是Boolean:有没有办法让CheckBoxPreference使用String-value值而不是Boolean值,这样我以后可以用该键调用getString?

目前,我正在聆听关于分享预感的问题&#39;并手动操作它,但也许有更好的方法。 (另一个明显的解决方法是在需要此值时使用getBoolean而不是getString,但让我们假设我不能这样做)

3 个答案:

答案 0 :(得分:0)

保存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();

答案 1 :(得分:0)

我能想到的最简单的方法是继承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" />

答案 2 :(得分:0)

这个怎么样:

    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中保存首选项的键字符串。