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;
    }

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

我已经尝试过重写DigitsKeyListener,如here所述

有没有办法可以强制所有设备在数字键盘上使用逗号(适用时甚至是总是)?

解决方法

我认为您的代码与使用相同的问题:

安卓的inputType = “numberDecimal”
机器人:位数=“0123456789”

(除了你的代码更通用)

问题 – 据我所知,当inputType为numberDecimal时,某些键盘只是不尊重数字属性.这是一个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();
        }
    }
}

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...