Как создать предпочтение, которое принимает только целые значения

Есть ли способ создать предпочтение в 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...

11
задан Gianni Costanzi 31 May 2012 в 21:22
поделиться