1

我有一个 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,但假设我不能这样做)

4

3 回答 3

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 中的键字符串。

于 2015-02-07T12:47:20.693 回答
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();
于 2014-10-16T08:33:45.380 回答
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" />
于 2014-10-16T09:34:13.800 回答