使用简单 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 默认情况下将值保存为整数?

有帮助吗?

解决方案

您可以扩展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()方法,但是您必须从基类复制一些代码。上面的解决方案更简单,但是这很棘手 - “字符串”方法可以用ints做一些事情。尝试不进一步扩展该课程;-)

您可以从XML使用:

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

其他提示

即使您设置了Android:Numeric =“ Integer”,它也将是文本偏好 - 顾名思义。您可以使用integer.valueof()轻松地将字符串值转换为int。 此外,您可以覆盖出口时自动进行转换的偏好性。


我认为最好的解决方案是编写简单的方法以从偏好中获取此值。就像是:

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

由于您已经设置了只能输入数字,因此不会在任何例外情况下。尚未完成我的答案:

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

我有同样的问题。 (我希望共享preference给我一个端口号,该端口编号我存储在首选项XML文件中,为DefaultValue)。

实施所有共享质量方法将是很多努力,因此在类上实现共享preferences的同类中编写自定义方法, 布鲁特 我认为建议最好。

您可以在需要的线路中使用整数的静态方法:

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

我认为这是我可能想出的最短的:

int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top