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

DigitsKeyListener

public class DigitsKeyListener extends NumberKeyListener
For digits-only text entry

Fields Summary
private char[]
mAccepted
private boolean
mSign
private boolean
mDecimal
private static final int
SIGN
private static final int
DECIMAL
private static final char[]
CHARACTERS
The characters that are used.
private static DigitsKeyListener[]
sInstance
Constructors Summary
public DigitsKeyListener()
Allocates a DigitsKeyListener that accepts the digits 0 through 9.


                   
      
        this(false, false);
    
public DigitsKeyListener(boolean sign, boolean decimal)
Allocates a DigitsKeyListener that accepts the digits 0 through 9, plus the minus sign (only at the beginning) and/or decimal point (only one per field) if specified.

        mSign = sign;
        mDecimal = decimal;

        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);
        mAccepted = CHARACTERS[kind];
    
Methods Summary
public java.lang.CharSequencefilter(java.lang.CharSequence source, int start, int end, android.text.Spanned dest, int dstart, int dend)

        CharSequence out = super.filter(source, start, end, dest, dstart, dend);

        if (mSign == false && mDecimal == false) {
            return out;
        }

        if (out != null) {
            source = out;
            start = 0;
            end = out.length();
        }

        int sign = -1;
        int decimal = -1;
        int dlen = dest.length();

        /*
         * Find out if the existing text has '-' or '.' characters.
         */

        for (int i = 0; i < dstart; i++) {
            char c = dest.charAt(i);

            if (c == '-") {
                sign = i;
            } else if (c == '.") {
                decimal = i;
            }
        }
        for (int i = dend; i < dlen; i++) {
            char c = dest.charAt(i);

            if (c == '-") {
                return "";    // Nothing can be inserted in front of a '-'.
            } else if (c == '.") {
                decimal = i;
            }
        }

        /*
         * If it does, we must strip them out from the source.
         * In addition, '-' must be the very first character,
         * and nothing can be inserted before an existing '-'.
         * Go in reverse order so the offsets are stable.
         */

        SpannableStringBuilder stripped = null;

        for (int i = end - 1; i >= start; i--) {
            char c = source.charAt(i);
            boolean strip = false;

            if (c == '-") {
                if (i != start || dstart != 0) {
                    strip = true;
                } else if (sign >= 0) {
                    strip = true;
                } else {
                    sign = i;
                }
            } else if (c == '.") {
                if (decimal >= 0) {
                    strip = true;
                } else {
                    decimal = i;
                }
            }

            if (strip) {
                if (end == start + 1) {
                    return "";  // Only one character, and it was stripped.
                }

                if (stripped == null) {
                    stripped = new SpannableStringBuilder(source, start, end);
                }

                stripped.delete(i - start, i + 1 - start);
            }
        }

        if (stripped != null) {
            return stripped;
        } else if (out != null) {
            return out;
        } else {
            return null;
        }
    
protected char[]getAcceptedChars()


    
       
        return mAccepted;
    
public intgetInputType()

        int contentType = InputType.TYPE_CLASS_NUMBER;
        if (mSign) {
            contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED;
        }
        if (mDecimal) {
            contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL;
        }
        return contentType;
    
public static android.text.method.DigitsKeyListenergetInstance()
Returns a DigitsKeyListener that accepts the digits 0 through 9.

        return getInstance(false, false);
    
public static android.text.method.DigitsKeyListenergetInstance(boolean sign, boolean decimal)
Returns a DigitsKeyListener that accepts the digits 0 through 9, plus the minus sign (only at the beginning) and/or decimal point (only one per field) if specified.

        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);

        if (sInstance[kind] != null)
            return sInstance[kind];

        sInstance[kind] = new DigitsKeyListener(sign, decimal);
        return sInstance[kind];
    
public static android.text.method.DigitsKeyListenergetInstance(java.lang.String accepted)
Returns a DigitsKeyListener that accepts only the characters that appear in the specified String. Note that not all characters may be available on every keyboard.

        // TODO: do we need a cache of these to avoid allocating?

        DigitsKeyListener dim = new DigitsKeyListener();

        dim.mAccepted = new char[accepted.length()];
        accepted.getChars(0, accepted.length(), dim.mAccepted, 0);

        return dim;