Есть ли способ создать предпочтение в PreferenceFragment, которое принимает только целочисленные значения? Я мог бы реализовать EditTextPreferenceи зарегистрировать OnPreferenceChangeListener, в котором я мог бы отклонить изменение, если пользователь вводит строку, которая не является числом, но я бы предпочел что-то, что предназначено для хранения только цифры, и это не позволяет пользователям вводить что-либо еще, возможно, показывает только клавиатуру набора номера. У меня нет такого предпочтения, поскольку каждый потомок Preferenceотображается на логическое значение ( CheckBoxPreference), String (*EditTextPreference) или массив String ( MultiSelectListPreference), т.е. нет предпочтений, отображаемых на целые числа, но, возможно, кто-то из вас может дать мне подсказку или хотя бы сказать меня, если есть лучшие решения, чем тот, который я предложил выше.
Решение, предложенное Греем:
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, чтобы отклонить числа с конечными нулями ( скажите мне, есть ли лучшее решение к этой последней проблеме, которая не связана с реализацией вашего собственного Preference). Было бы прекрасно, если бы мы могли изменить newValueв OnPreferenceChangeListener...