Android InputType-Layoutparameter – wie lassen sich negative Dezimalstellen zulassen?

Lesezeit: 4 Minuten

Ich habe ein Layout, das drei Felder für die Eingabe von drei Kartenkoordinaten hat. So weit, ist es gut. Ich verwende android:inputType=”numberDecimal” im Layout. Beim Betreten des Feldes erhält der Benutzer die numerische Tastatur. Immer noch gut.

Wenn jedoch eine negative Koordinate eingegeben werden muss, gibt es keine offensichtliche Möglichkeit, dies zu tun.

23.2342 funktioniert einwandfrei. 232.3421 funktioniert einwandfrei. -11.23423 kann nicht eingegeben werden – es gibt keine Möglichkeit, das führende negative Vorzeichen einzugeben oder sogar die Koordinate in () einzuschließen.

Ich bin mir sicher, dass ich den Weg gehen kann, dies in reinen Text inputType zu ändern und dann einen regulären Ausdruck zu verwenden, um zu validieren, dass das, was eingegeben wurde, tatsächlich eine numerische Koordinate ist, Fehlermeldungen an den Benutzer zurückgibt usw. Aber ich würde lieber nicht diesen Weg gehen.

Ich habe diese Frage ein paar Stunden lang ohne Glück gegoogelt und Stackoverflowed. Irgendwelche Vorschläge?

  • Ich hatte das gleiche Problem, aber Kevins Antwort löste mein Problem. Ich brauchte nur die Möglichkeit, einen Nur-Zahlen-EditText mit der Fähigkeit zu haben, negative Zahlen zu haben. Vielen Dank! android:inputType=”numberDecimal|numberSigned”

    – der PITman

    14. August 2011 um 15:54 Uhr

  • Die hier gepostete Antwort ist die einfachste Lösung, nach der Sie suchen, um Ihr Problem zu lösen, also werfen Sie einen Blick darauf 😉

    – SerSánGal

    21. September 2015 um 16:09 Uhr

Benutzer-Avatar
Kevin Burandt

Es sei denn, ich vermisse etwas, das ist alles, was Sie brauchen

android:inputType="numberDecimal|numberSigned"

  • Ich bin mir nicht sicher, ob dies veraltet ist, aber Mono akzeptierte die untere Eingabe nicht mehr. Das Oberteil sollte für beide funktionieren

    – xximjasonxx

    15. Oktober 2014 um 21:40 Uhr

  • Ich habe den unteren Eingang entfernt.

    – Kevin Burandt

    16. Dezember 2014 um 14:40 Uhr

Benutzer-Avatar
Archie

Bitte verwenden Sie diesen Code

 et.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);

Sie müssen numberSigned im EditText-Tag Ihres Layouts hinzufügen (*.xml)

 <EditText android:inputType="numberDecimal|numberSigned"></EditText>

Viel Glück!

Legen Sie InputType.TYPE_NUMBER_FLAG_SIGNED fest EditText.setInputType

Ich denke, dass das Erstellen Ihres eigenen benutzerdefinierten Keylisteners die beste Wahl ist. Ich habe etwas Ähnliches gemacht. Ich habe einen SignedDecimalKeyListener wie folgt erstellt:

public class SignedDecimalKeyListener extends NumberKeyListener 
{
    private char[] mAccepted;
    private static SignedDecimalKeyListener sInstance;

    private static final char[] CHARACTERS = new char[] { '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' };

    @Override
    protected char[] getAcceptedChars()
    {
        return mAccepted;
    }

    private SignedDecimalKeyListener()
    {
        mAccepted = CHARACTERS;
    }

    public static SignedDecimalKeyListener getInstance()
    {
        if(sInstance != null) 
            return sInstance;
        sInstance = new SignedDecimalKeyListener();
        return sInstance;
    }

    public int getInputType()
    {
        return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
    {
        CharSequence out = super.filter(source, start, end, dest, dstart, dend);

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

        //Only allow a '-' to be the very first char
        //and don't allow '.' to be the first char
        if(dstart > 0 && source.equals("-") || dstart == 0 && source.equals("."))
        {
            SpannableStringBuilder stripped = null;

            stripped = new SpannableStringBuilder(source, start, end);
            stripped.delete(start, end);

            if(stripped != null)
                return stripped;
        }
        else if(source.equals("."))
        {
            for(int lo = dend-1; lo > 0; lo--)
            {
                char c = dest.charAt(lo);
                if(source.equals(String.valueOf(c)))
                {
                    SpannableStringBuilder stripped = null;

                    stripped = new SpannableStringBuilder(source, start, end);
                    stripped.delete(start, end);

                    if(stripped != null)
                        return stripped;
                }
            }
        }

        if(out != null)
            return out;
        else
            return null;
    }
}

Und dann verwenden Sie diesen benutzerdefinierten Keylistener mit Ihrem Bearbeitungstext wie folgt:

EditText myEditText = (EditText)findViewById(R.id.myedittext);
myEditText.setKeyListener(SignedDecimalKeyListener.getInstance());

Benutzer-Avatar
DArkO

Ich bin mir über den Eingabetyp nicht sicher, aber Sie können jederzeit Ihren eigenen Textfilter erstellen und ihn an ein editText-Feld anhängen. das ist ziemlich einfach. Sie können die Überprüfung für jedes Zeichen durchführen und nur die Zahlen, den Punkt oder ein beliebiges benutzerdefiniertes Zeichen zulassen.

Benutzer-Avatar
Haresh Chhelana

Am Ende wurden Pattern und Matcher für jede der Achsen verwendet, wobei das eigentliche Texteingabeformat offen blieb.

Drei Achsenfelder, Schaltfläche „Senden“ löst onSave aus. Die Felder werden validiert und entweder erfolgt die Einfügung oder es wird eine Fehlermeldung bezüglich des erforderlichen Formats für die Axes-Felder an den Absender ausgegeben. Das richtige Format besteht aus 1-3 Ziffern, optional mit vorangestelltem „-“, optional gefolgt von „.“ und zusätzliche Ziffern.

Versuchen Sie diesen Code:

private View.OnClickListener onSave=new View.OnClickListener(){
    public void onClick(View v){
        Pattern xAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForX = xAxis.matcher(xaxis.getText().toString());

        Pattern yAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForY = yAxis.matcher(yaxis.getText().toString());

        Pattern zAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForZ = zAxis.matcher(zaxis.getText().toString());

        //If Axis X and Axis Y and Axis Z are all valid entries, the proceed.
        if(mForX.find() && mForY.find() && mForZ.find()){
             //handle insert or update statement here
        }else{
             //give error message regarding correct Axis value format
        }
   }

}

1206450cookie-checkAndroid InputType-Layoutparameter – wie lassen sich negative Dezimalstellen zulassen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy