Android – запятая в качестве десятичного разделителя на цифровой клавиатуре

Нам нужна цифровая клавиатура для EditText. Клавиатура должна иметь десятичный разделитель в зависимости от выбранной локали устройства. Мы реализовали это, установив для пользовательского DigitsKeyListener значение EditText.

public class NumericDigitsKeyListener extends DigitsKeyListener {


    @Override
    protected char[] getAcceptedChars() {

        char[] acceptedCharacters = null;

            acceptedCharacters =  new char[] {
                    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                    new DecimalFormatSymbols(Locale.getDefaultLocale()).getDecimalSeparator()

        return acceptedCharacters;
    }

    /**
     * @see android.text.method.DigitsKeyListener#getInputType()
     */
    public int getInputType() {
        return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
    }

Вышеупомянутое, кажется, работает нормально для большинства устройств, однако для Samsung Galaxy S-II программная клавиатура не имеет запятой на клавиатуре. На клавиатуре swype устройства отображается запятая, а на клавиатуре по умолчанию - нет.

Я попытался переопределить DigitsKeyListener, как указано здесь

Есть ли способ заставить все устройства иметь запятую (когда это применимо или даже всегда) на цифровой клавиатуре?


person Kaushal Panjwani    schedule 13.06.2012    source источник
comment
Мое решение этой проблемы находится здесь: https://stackoverflow.com/a/63520135/11033601   -  person Alex K    schedule 21.08.2020


Ответы (1)


Я думаю, что ваш код имеет ту же проблему, что и использование:

android:inputType="numberDecimal" android:digits="0123456789,"

(за исключением того, что ваш код более общий)

Проблема, как я понимаю, в том, что некоторые клавиатуры просто не учитывают свойство digits, когда inputType равно numberDecimal. Это задокументированная ошибка, и это единственный способ избежать это поведение заключается в использовании inputType="text" и установке входного фильтра для ограничения символов. Конечно, клавиатура не подходит для цифр, но лучшего решения не нашел. Фильтр будет примерно таким:

mEditText.setFilters(new InputFilter[] { new DecimalInputFilter() });


public class DecimalInputFilter implements InputFilter {

    private static final String ALLOWED_CHARS = "0123456789,";

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        if (source instanceof SpannableStringBuilder) {
            final SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
            for (int i = end - 1; i >= start; i--) { 
                final char currentChar = source.charAt(i);
                 if (!StringUtils.contains(ALLOWED_CHARS, currentChar)) {    
                     sourceAsSpannableBuilder.delete(i, i+1);
                 }     
            }
            return source;
        } else {
            final StringBuilder filteredStringBuilder = new StringBuilder();
            for (int i = 0; i < end; i++) { 
                final char currentChar = source.charAt(i);
                if (StringUtils.contains(ALLOWED_CHARS, currentChar)) {    
                    filteredStringBuilder.append(currentChar);
                }     
            }
            return filteredStringBuilder.toString();
        }
    }
}
person Pedro Andrade    schedule 20.02.2013