我知道这是一个已被接受的答案的老问题,但我认为我的解决方案可能对寻找更完整答案的人有所帮助。我刚刚改进了@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 打开的 Dialog 中达到所需的 EditText 效果,只需通过实现在您的自定义 EditTextPreference 中设置输入类型,EditTextPreference.OnBindEditTextListener
如您在上面的代码中所见。
这对我有用。