我有一个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,但让我们假设我不能这样做)
答案 0 :(得分:0)
保存SharedPreferences
时,通过调用特定方法指定其类型,例如:
SharedPreferences.Editor.putBoolean
或SharedPreferences.Editor.putFloat
或SharedPreferences.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中保存首选项的键字符串。