PreferenceActivity:将值保存为整数

在我的首选项活动中使用一个简单的EditTextPreference

 <EditTextPreference android:key="SomeKey" android:title="@string/some_title" android:summary="..." android:numeric="integer" android:maxLength="2" /> 

有没有办法将这个configuration值保存为整数? 现在看来,它只是允许input数字,但值仍然保存为string:

呼叫:

 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默认保存为整数值?

你可以扩展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)); } } 

覆盖SetInitialValue()和setText()方法会更好,但是您必须从基类中复制一些代码。 上面的解决scheme是简单的,但它是非常棘手的 – “string”方法用int整理。 尽量不要再扩展这个类;-)

您可以通过以下方式使用它:

 <package.name.IntEditTextPreference android:key="SomeKey" android:title="@string/some_title" android:summary="..." android:numeric="integer" android:maxLength="2" /> 

即使你设置了android:numeric =“integer”,它也将是文本首选项 – 正如它的名字所暗示的那样。 你可以很容易地使用Integer.valueOf()将string值转换为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); } 

那么你可以很容易地从你的代码中使用它。

即使答案已被接受,我想分享一个更短的方式来实现这一点:

 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); int value = Integer.parseInt(preferences.getString("SomeKey", "-1")); 

既然你已经设定只有数字可以input,这不会通过任何例外。 还没有完成我的答案:

 <EditTextPref android:key="SomeKey" android:title="@string/some_title" android:summary="..." android:numeric="integer" android:maxLength="2" /> 

我有同样的问题。 (我想SharedPreference给我一个端口号,我作为defaultValue存储在偏好xml文件中)。

实现所有的SharedPreferences方法将是非常努力的,所以在实例化SharedPreferences的类中编写一个自定义方法,就像broot所build议的那样,我认为是最好的。

你也可以在需要的地方使用Integer的Static方法:

 int number = Integer.valueOf(settings.getString("myNumberString", "0"));