854 Stimmen

Was ist der beste Weg, um die Textlänge von EditText in Android zu begrenzen?

Wie lässt sich die Textlänge eines Dokuments am besten begrenzen? EditText in Android?

Gibt es eine Möglichkeit, dies über xml zu tun?

1 Stimmen

Ich wollte die maximale Anzahl von Zeichen für meinen EditText festlegen. Zuerst war es nicht offensichtlich, dass die Begrenzung der Textlänge dasselbe ist. (Nur eine Anmerkung für einen anderen verwirrten Reisenden).

0 Stimmen

El die richtige Antwort finden Sie hier : stackoverflow.com/a/19222238/276949 . Diese Antwort begrenzt die Länge UND verhindert, dass sich ein Puffer kontinuierlich füllt, nachdem er die Grenze erreicht hat, so dass Ihre Rücktaste richtig zu funktionieren.

41voto

ramo2712 Punkte 472
TextView tv = new TextView(this);
tv.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(250) });

7 Stimmen

Sicher, nur für Android

24voto

Für alle anderen, die sich fragen, wie sie dies erreichen können, habe ich hier eine ausführliche Beschreibung EditText classe EditTextNumeric .

.setMaxLength(int) - legt die maximale Anzahl der Ziffern fest

.setMaxValue(int) - Grenze maximaler ganzzahliger Wert

.setMin(int) - Grenze minimaler ganzzahliger Wert

.getValue() - Ganzzahligen Wert erhalten

import android.content.Context;
import android.text.InputFilter;
import android.text.InputType;
import android.widget.EditText;

public class EditTextNumeric extends EditText {
    protected int max_value = Integer.MAX_VALUE;
    protected int min_value = Integer.MIN_VALUE;

    // constructor
    public EditTextNumeric(Context context) {
        super(context);
        this.setInputType(InputType.TYPE_CLASS_NUMBER);
    }

    // checks whether the limits are set and corrects them if not within limits
    @Override
    protected void onTextChanged(CharSequence text, int start, int before, int after) {
        if (max_value != Integer.MAX_VALUE) {
            try {
                if (Integer.parseInt(this.getText().toString()) > max_value) {
                    // change value and keep cursor position
                    int selection = this.getSelectionStart();
                    this.setText(String.valueOf(max_value));
                    if (selection >= this.getText().toString().length()) {
                        selection = this.getText().toString().length();
                    }
                    this.setSelection(selection);
                }
            } catch (NumberFormatException exception) {
                super.onTextChanged(text, start, before, after);
            }
        }
        if (min_value != Integer.MIN_VALUE) {
            try {
                if (Integer.parseInt(this.getText().toString()) < min_value) {
                    // change value and keep cursor position
                    int selection = this.getSelectionStart();
                    this.setText(String.valueOf(min_value));
                    if (selection >= this.getText().toString().length()) {
                        selection = this.getText().toString().length();
                    }
                    this.setSelection(selection);
                }
            } catch (NumberFormatException exception) {
                super.onTextChanged(text, start, before, after);
            }
        }
        super.onTextChanged(text, start, before, after);
    }

    // set the max number of digits the user can enter
    public void setMaxLength(int length) {
        InputFilter[] FilterArray = new InputFilter[1];
        FilterArray[0] = new InputFilter.LengthFilter(length);
        this.setFilters(FilterArray);
    }

    // set the maximum integer value the user can enter.
    // if exeeded, input value will become equal to the set limit
    public void setMaxValue(int value) {
        max_value = value;
    }
    // set the minimum integer value the user can enter.
    // if entered value is inferior, input value will become equal to the set limit
    public void setMinValue(int value) {
        min_value = value;
    }

    // returns integer value or 0 if errorous value
    public int getValue() {
        try {
            return Integer.parseInt(this.getText().toString());
        } catch (NumberFormatException exception) {
            return 0;
        }
    }
}

Beispiel für die Verwendung:

final EditTextNumeric input = new EditTextNumeric(this);
input.setMaxLength(5);
input.setMaxValue(total_pages);
input.setMinValue(1);

Alle anderen Methoden und Attribute, die sich auf EditText funktionieren natürlich auch.

1 Stimmen

Es wäre besser, wenn wir dies in xml Layout hinzufügen. Ich erhalte einen Fehler, wenn ich xml verwende Caused by: Android.view.InflateException: Binary XML file line #47: Fehler beim Aufblasen der Klasse com.passenger.ucabs.utils.EditTextNumeric

0 Stimmen

@Martynas Habe den gleichen Fehler wie Shihab_returns jede Lösung?

24voto

João Carlos Punkte 917

Xml

android:maxLength="10"

Java:

InputFilter[] editFilters = editText.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = new InputFilter.LengthFilter(maxLength);
editText.setFilters(newFilters);

Kotlin:

editText.filters += InputFilter.LengthFilter(maxLength)

18voto

Tim Gallagher Punkte 181

Aufgrund der Beobachtung von goto10 habe ich den folgenden Code erstellt, um zu verhindern, dass andere Filter bei der Einstellung der maximalen Länge verloren gehen:

/**
 * This sets the maximum length in characters of an EditText view. Since the
 * max length must be done with a filter, this method gets the current
 * filters. If there is already a length filter in the view, it will replace
 * it, otherwise, it will add the max length filter preserving the other
 * 
 * @param view
 * @param length
 */
public static void setMaxLength(EditText view, int length) {
    InputFilter curFilters[];
    InputFilter.LengthFilter lengthFilter;
    int idx;

    lengthFilter = new InputFilter.LengthFilter(length);

    curFilters = view.getFilters();
    if (curFilters != null) {
        for (idx = 0; idx < curFilters.length; idx++) {
            if (curFilters[idx] instanceof InputFilter.LengthFilter) {
                curFilters[idx] = lengthFilter;
                return;
            }
        }

        // since the length filter was not part of the list, but
        // there are filters, then add the length filter
        InputFilter newFilters[] = new InputFilter[curFilters.length + 1];
        System.arraycopy(curFilters, 0, newFilters, 0, curFilters.length);
        newFilters[curFilters.length] = lengthFilter;
        view.setFilters(newFilters);
    } else {
        view.setFilters(new InputFilter[] { lengthFilter });
    }
}

3 Stimmen

Möglicherweise sollten Sie den Code leicht anpassen. Das zugewiesene Array muss die Größe von curFilters.length + 1 haben und nachdem Sie newFilters erstellt haben, haben Sie "this" nicht auf das neu zugewiesene Array gesetzt. InputFilter newFilters[] = new InputFilter[curFilters.length + 1]; System.arraycopy(curFilters, 0, newFilters, 0, curFilters.length); this.setFilters(newFilters);

16voto

Kishore Reddy Punkte 2276
//Set Length filter. Restricting to 10 characters only
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH)});

//Allowing only upper case characters
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

//Attaching multiple filters
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH), new InputFilter.AllCaps()});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X