在我的偏好设施活动中使用简单的EditTextPreference
:
<EditTextPreference
android:key="SomeKey"
android:title="@string/some_title"
android:summary="..."
android:numeric="integer"
android:maxLength="2"
/>
有没有办法将此配置值保存为整数?现在似乎只允许输入数字,但该值仍保存为字符串:
通话:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int value = preferences.getInt("SomeKey", -1);
抛出我java.lang.ClassCastException: java.lang.String
,然后:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String value = preferences.getString("SomeKey", "-1");
成功检索该值。
如何使PreferenceActivity
默认将值保存为整数?
答案 0 :(得分:65)
您可以扩展EditTextPreference:
public class IntEditTextPreference extends EditTextPreference {
public IntEditTextPreference(Context context) {
super(context);
}
public IntEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected String getPersistedString(String defaultReturnValue) {
return String.valueOf(getPersistedInt(-1));
}
@Override
protected boolean persistString(String value) {
return persistInt(Integer.valueOf(value));
}
}
覆盖onSetInitialValue()和setText()方法会更好,但是你必须从基类复制一些代码。上面的解决方案更简单,但它非常棘手 - “字符串”方法使用整数。尽量不要进一步扩展这个类; - )
您可以通过以下方式在XML中使用它:
<package.name.IntEditTextPreference
android:key="SomeKey"
android:title="@string/some_title"
android:summary="..."
android:numeric="integer"
android:maxLength="2"
/>
答案 1 :(得分:7)
即使您设置了android:numeric =“integer”,它也将是文本首选项 - 顾名思义。您可以使用Integer.valueOf()轻松地将字符串值转换为int。 您也可以覆盖PreferenceActivity以在退出时自动进行转换。
我认为最好的解决方案是编写简单的方法从偏好中获取此值。类似的东西:
public static int getSomePref(Context context) {
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(context);
String value = prefs.getString("SomeKey", null);
return value == null ? -1 : Integer.valueOf(value);
}
然后您可以很容易地从代码中使用它。
答案 2 :(得分:4)
即使已经接受了答案,我还想分享一个更短的方法来实现这个目标:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int value = Integer.parseInt(preferences.getString("SomeKey", "-1"));
由于您已经设定只能输入数字,因此不会遇到任何异常。 尚未完成我的回答:
<EditTextPref
android:key="SomeKey"
android:title="@string/some_title"
android:summary="..."
android:numeric="integer"
android:maxLength="2" />
答案 3 :(得分:0)
我遇到了同样的问题。 (我希望SharedPreference给我一个端口号,我将其作为defaultValue存储在首选项xml文件中。)
实现所有的SharedPreferences方法需要付出很多努力,因此在实例化SharedPreferences的类中编写自定义方法,如broot所建议的那样,我认为最好。
您也可以在需要的行中使用Integer的Static方法:
int number = Integer.valueOf(settings.getString("myNumberString", "0"));
答案 4 :(得分:0)
我认为这是我能想到的最短的方法:
int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
答案 5 :(得分:0)
我知道这是一个已经被接受的老问题,但我认为我的解决方案可以帮助寻找更完整答案的人。我刚刚改进了@broot 的回答,然后是我的解决方案:
覆盖 EditTextPreference 以提供文本到 int 的转换:
public class IntEditTextPreference extends EditTextPreference implements EditTextPreference.OnBindEditTextListener {
private String mText;
public IntEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setOnBindEditTextListener(this);
}
public IntEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOnBindEditTextListener(this);
}
public IntEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setOnBindEditTextListener(this);
}
public IntEditTextPreference(Context context) {
super(context);
setOnBindEditTextListener(this);
}
/**
* Saves the text to the current data storage.
*
* @param text The text to save
*/
public void setText(String text) {
final boolean wasBlocking = shouldDisableDependents();
mText = text;
int value = Integer.parseInt(text);
persistInt(value);
final boolean isBlocking = shouldDisableDependents();
if (isBlocking != wasBlocking) {
notifyDependencyChange(isBlocking);
}
notifyChanged();
}
/**
* Gets the text from the current data storage.
*
* @return The current preference value
*/
public String getText() {
return mText;
}
@Override
protected void onSetInitialValue(Object defaultValue) {
int value;
if (defaultValue != null) {
String strDefaultValue = (String) defaultValue;
int defaultIntValue = Integer.parseInt(strDefaultValue);
value = getPersistedInt(defaultIntValue);
} else {
value = getPersistedInt(0);
}
setText(Integer.toString(value));
}
@Override
public boolean shouldDisableDependents() {
return TextUtils.isEmpty(mText) || super.shouldDisableDependents();
}
@Override
public void onBindEditText(@NonNull EditText editText) {
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
}
}
在首选项 xml 中:
<your.package.here.IntEditTextPreference
android:key="some_key"
android:title="@string/some_title"
android:defaultValue="5"
app:useSimpleSummaryProvider="true"/>
注意:不要使用 android:numeric 或 android:inputType。由于 EditTextPreference 不是 EditText 本身,因此设置这些属性将不起作用。为了从 EditTextPreference 打开的对话框中对 EditText 实现所需的效果,只需通过实现 EditTextPreference.OnBindEditTextListener
在您的自定义 EditTextPreference 中设置输入类型,如您在上面的代码中所见。
这对我有用。