【问题标题】:Android - Comma as decimal separator on Numeric KeyboardAndroid - 逗号作为数字键盘上的小数分隔符
【发布时间】:2012-06-16 02:17:06
【问题描述】:

我们需要为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;
    }

以上内容似乎适用于大多数设备,但对于三星 Galaxy S-II,软键盘的键盘中没有逗号。设备的 swype 键盘显示逗号,但默认键盘没有。

我已尝试覆盖 here 中提到的 DigitsKeyListener

有没有一种方法可以强制所有设备在数字键盘上使用逗号(如果适用,甚至总是)?

【问题讨论】:

标签: android locale android-softkeyboard galaxy comma


【解决方案1】:

我认为你的代码和使用有同样的问题:

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

(除了你的代码更通用)

问题 - 据我了解,当 inputType 为 numberDecimal 时,某些键盘不尊重 digits 属性。这是documented bug,我发现避免这种行为的唯一方法是使用 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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 2012-09-28
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    相关资源
    最近更新 更多