有没有办法在只接受整数值的PreferenceFragment中创建首选项?我可以实现一个EditTextPreference并注册一个OnPreferenceChangeListener如果用户输入不是数字的字符串,我可以在其中拒绝更改,但我更喜欢仅用于保存数字并且不允许用户输入任何其他内容的东西, 可能只显示一个拨号盘键盘.. 我不存在这样的偏好,因为Preference的每个后代都映射到布尔值 ( CheckBoxPreference )、字符串 (*EditTextPreference) 或字符串数组 ( MultiSelectListPreference),即没有首选项映射到整数,但也许你们中的一些人可以给我一个提示,或者至少告诉我是否有比我上面提出的更好的解决方案。
Grey 提出的解决方案:
EditText editText = ((EditTextPreference)
findPreference("intent_property")).getEditText();
editText.setKeyListener(new NumberKeyListener() {
@Override
public int getInputType() {
// The following shows the standard keyboard but switches to the view
// with numbers on available on the top line of chars
return InputType.TYPE_CLASS_NUMBER;
// Return the following to show a dialpad as the one shown when entering phone
// numbers.
// return InputType.TYPE_CLASS_PHONE
}
@Override
protected char[] getAcceptedChars() {
return new String("1234567890").toCharArray();
}
});
更短的解决方案,它不允许将键盘更改为拨号盘,但需要更少的代码:
EditText editText = ((EditTextPreference)
findPreference("intent_property")).getEditText();
editText.setKeyListener(new DigitsKeyListener());
我不喜欢这个解决方案的一件事:用户可以输入 0000 并且它被接受并保存在共享首选项(这是一个字符串)中作为“0000”.. 这需要您实现 OnSharedPreferenceChangeListener 来拦截更改共享首选项并删除此首选项中的前导零或直接在此首选项上实现更改侦听器并返回 false 以拒绝带有尾随零的数字(告诉我是否有更好的解决方案来解决最后一个问题,不涉及实现您自己的首选项)。如果我们可以修改OnPreferenceChangeListener中的newValue那就太好了。