8

の数値キーボードが必要EditTextです。キーボードには、デバイスの選択されたロケールに基づく小数点記号が必要です。カスタムDigitsKeyListenerEditText

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 では、ソフトキーボードのキーボードにコンマがありません。デバイスのスワイプ キーボードにはコンマが表示されますが、デフォルトのキーボードには表示されません。

ここで述べたように DigitsKeyListener をオーバーライドしようとしました

すべてのデバイスにカンマ (該当する場合、または常に) をテンキー キーボードに表示するように強制する方法はありますか?

4

1 に答える 1

1

あなたのコードには、以下を使用するのと同じ問題があると思います:

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

(コードがより一般的であることを除いて)

問題 - 私が理解しているように、 inputTypenumberDecimalの場合、一部のキーボードはdigitsプロパティを尊重しないということです。これは文書化されたバグであり、この動作を回避する唯一の方法は、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();
        }
    }
}
于 2013-02-20T18:06:57.887 に答える