【发布时间】:2012-05-30 21:29:11
【问题描述】:
有没有办法在只接受整数值的 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就更好了..
【问题讨论】:
-
您如何以the source of
EditTextPreference为起点,将所有与字符串相关的方法换成基于int 的对应方法?对我来说似乎很简单。此外,从那时起,您将可以直接访问EditText对象,您可以根据自己的喜好设置任何仅限数字的输入类型。 -
@MH 如果我以编程方式管理首选项似乎很简单,但是如果我创建一个 EditTextIntegerPreference,例如,我不能在传递给的 XML 文件中使用它PreferenceFragment,或者有没有办法注册一个映射到我的新对象的新 XML 标记?
-
您可以像使用自定义视图一样在 xml 文件中使用自定义首选项。只需提供完全限定的类名;例如
com.costanzi.gianni.example.ExamplePreference。例如,请参阅this API demo。 -
@MH 太棒了!感谢您提供有用的链接!
-
感谢您撰写本文。它给了我一些关于如何处理我的 EditTextPreference 的线索。 :D
标签: android android-edittext android-preferences