PreferenceActivity:将值保存为整数

Lai*_*jus 49 android preferenceactivity sharedpreferences

EditTextPreference在我的偏好活动中使用简单的:

<EditTextPreference
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2"
/>
Run Code Online (Sandbox Code Playgroud)

有没有办法将此配置值保存为整数?现在似乎只允许输入数字,但该值仍保存为字符串:

呼叫:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int value = preferences.getInt("SomeKey", -1);
Run Code Online (Sandbox Code Playgroud)

抛出我java.lang.ClassCastException: java.lang.String,并且:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String value = preferences.getString("SomeKey", "-1");
Run Code Online (Sandbox Code Playgroud)

成功检索值.

如何PreferenceActivity默认将值保存为整数?

bro*_*oot 68

您可以扩展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));
    }
}
Run Code Online (Sandbox Code Playgroud)

覆盖onSetInitialValue()和setText()方法会更好,但是你必须从基类复制一些代码.上面的解决方案更简单,但它非常棘手 - "字符串"方法使用整数.尽量不要进一步扩展这个类;-)

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

<package.name.IntEditTextPreference
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2"
/>
Run Code Online (Sandbox Code Playgroud)

  • 我在`return String.valueOf(getPersistedInt(-1));`上得到运行时错误,由于该行无法启动活动 (3认同)
  • @user942821 但是否没有默认类型为 int 的偏好?疯狂的是,它不仅在那里,还需要所有这些额外的代码。为什么默认情况下没有“EditIntPreference”标签? (2认同)

bro*_*oot 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);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以很容易地从你的代码中使用它.