FileDocCategorySizeDatePackage
NumberKeyListener.javaAPI DocAndroid 1.5 API4085Wed May 06 22:41:56 BST 2009android.text.method

NumberKeyListener

public abstract class NumberKeyListener extends BaseKeyListener implements android.text.InputFilter
For numeric text entry

Fields Summary
Constructors Summary
Methods Summary
public java.lang.CharSequencefilter(java.lang.CharSequence source, int start, int end, android.text.Spanned dest, int dstart, int dend)

        char[] accept = getAcceptedChars();
        boolean filter = false;

        int i;
        for (i = start; i < end; i++) {
            if (!ok(accept, source.charAt(i))) {
                break;
            }
        }

        if (i == end) {
            // It was all OK.
            return null;
        }

        if (end - start == 1) {
            // It was not OK, and there is only one char, so nothing remains.
            return "";
        }

        SpannableStringBuilder filtered =
            new SpannableStringBuilder(source, start, end);
        i -= start;
        end -= start;

        int len = end - start;
        // Only count down to i because the chars before that were all OK.
        for (int j = end - 1; j >= i; j--) {
            if (!ok(accept, source.charAt(j))) {
                filtered.delete(j, j + 1);
            }
        }

        return filtered;
    
protected abstract char[]getAcceptedChars()
You can say which characters you can accept.

protected intlookup(android.view.KeyEvent event, android.text.Spannable content)

        return event.getMatch(getAcceptedChars(), getMetaState(content));
    
protected static booleanok(char[] accept, char c)

        for (int i = accept.length - 1; i >= 0; i--) {
            if (accept[i] == c) {
                return true;
            }
        }

        return false;
    
public booleanonKeyDown(android.view.View view, android.text.Editable content, int keyCode, android.view.KeyEvent event)

        int selStart, selEnd;

        {
            int a = Selection.getSelectionStart(content);
            int b = Selection.getSelectionEnd(content);

            selStart = Math.min(a, b);
            selEnd = Math.max(a, b);
        }

        if (selStart < 0 || selEnd < 0) {
            selStart = selEnd = 0;
            Selection.setSelection(content, 0);
        }

        int i = event != null ? lookup(event, content) : 0;
        int repeatCount = event != null ? event.getRepeatCount() : 0;
        if (repeatCount == 0) {
            if (i != 0) {
                if (selStart != selEnd) {
                    Selection.setSelection(content, selEnd);
                }

                content.replace(selStart, selEnd, String.valueOf((char) i));

                adjustMetaAfterKeypress(content);
                return true;
            }
        } else if (i == '0" && repeatCount == 1) {
            // Pretty hackish, it replaces the 0 with the +

            if (selStart == selEnd && selEnd > 0 &&
                    content.charAt(selStart - 1) == '0") {
                content.replace(selStart - 1, selEnd, String.valueOf('+"));
                adjustMetaAfterKeypress(content);
                return true;
            }
        }

        adjustMetaAfterKeypress(content);
        return super.onKeyDown(view, content, keyCode, event);