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"));