Wie kann ich maxLength in Android TextView programmgesteuert einstellen?


176

Ich möchte die maxLengthEigenschaft programmgesteuert festlegen, TextViewda ich sie im Layout nicht fest codieren möchte. Ich kann keine setMethode sehen, die damit zusammenhängt maxLength.

Kann mir jemand helfen, wie ich das erreichen kann?

Antworten:


363

Sollte so etwas sein. aber nie für die Textansicht verwendet, nur edittext:

TextView tv = new TextView(this);
int maxLength = 10;
InputFilter[] fArray = new InputFilter[1];
fArray[0] = new InputFilter.LengthFilter(maxLength);
tv.setFilters(fArray);

119
Darauf aufbauend könnte es viel sauberer sein: tv.setFilters (neuer InputFilter [] {neuer InputFilter.LengthFilter (10)});
Mark D

43
Konnte nicht einfach "maxLength ()" sagen .. nein, nein, nein .. das wäre zu einfach. sie mussten es abstrakt machen .. yay!
wütendITguy

3
Aber das wird deine vorherigen Filter zurücksetzen, nein?
Crgarridos

19
Mit Kotlin können Sie es sauberer machen: editText.filters = arrayOf (InputFilter.LengthFilter (10))
Elvis Chidera

5
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10))Behalte alte Filter mit Kotlin
Peter Samokhin

85

Versuche dies

int maxLengthofEditText = 4;    
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLengthofEditText)});

1
Das funktioniert bei mir, aber in Android 5.1 können Sie weiterhin Buchstaben eingeben, die im Eingabefeld nur "unsichtbar" sind. Sie werden jedoch im Textvorschlag angezeigt. Und wenn Sie versuchen, Buchstaben am Ende zu löschen.
Radon8472

11
Dies ist kein "anderer Weg", sondern die Kurzversion der ersten Antwort.
Ninja Coding

21

Einfache Möglichkeit , Textzeichen zu bearbeiten :

EditText ed=(EditText)findViewById(R.id.edittxt);
ed.setFilters(new InputFilter[]{new InputFilter.LengthFilter(15)});

16

Für diejenigen unter Ihnen, die Kotlin verwenden

fun EditText.limitLength(maxLength: Int) {
    filters = arrayOf(InputFilter.LengthFilter(maxLength))
}

Dann können Sie einfach eine einfache editText.limitLength (10) verwenden.


1
Warum nicht setMaxLength als Funktionsnamen verwenden? Sie können dies auch auf Textansicht anwenden ... danke +1 :)
crgarridos

Ich habe andere Methoden, die diesem Muster folgen: limitDecimalPlaces, limitNumberOnly, limitAscii, um mit limitLength mitzuhalten.
Kevin

1
Filter = Filter.plus (InputFilter.LengthFilter (max)) Überschreiben Sie keine vorhandenen
ersin-ertan

7

Wie João Carlos sagte, verwenden Sie in Kotlin:

editText.filters += InputFilter.LengthFilter(10)

Siehe auch https://stackoverflow.com/a/58372842/2914140 über das seltsame Verhalten einiger Geräte.

(Hinzufügen android:inputType="textNoSuggestions"zu Ihrem EditText.)


1
Es ist ein Fehler, wenn Sie die Länge ändern möchten, wie in meinem Fall, wenn ich MaxLength von 10 auf 20 ändere, aber wie im Code fügen wir Filter hinzu. Es bleibt MaxLength 10 bcus jetzt im Array, wir haben 10,20 zwei maximale Längen.
Nikhil

@Nikhil, stimme dir zu, danke! Ja, in diesem Fall sollten wir zuerst einen Filter ( LengthFilter(10)) entfernen und dann einen weiteren ( LengthFilter(20)) hinzufügen .
CoolMind

6

Für Kotlin und ohne Zurücksetzen vorheriger Filter:

fun TextView.addFilter(filter: InputFilter) {
  filters = if (filters.isNullOrEmpty()) {
    arrayOf(filter)
  } else {
    filters.toMutableList()
      .apply {
        removeAll { it.javaClass == filter.javaClass }
        add(filter)
      }
      .toTypedArray()
  }
}

textView.addFilter(InputFilter.LengthFilter(10))

1

Ich habe eine einfache Erweiterungsfunktion für diese gemacht

/**
 * maxLength extension function makes a filter that 
 * will constrain edits not to make the length of the text
 * greater than the specified length.
 * 
 * @param max
 */
fun EditText.maxLength(max: Int){
    this.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(max))
}

editText?.maxLength(10)

0
     AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("Title");


                    final EditText input = new EditText(this);
                    input.setInputType(InputType.TYPE_CLASS_NUMBER);
//for Limit...                    
input.setFilters(new InputFilter[] {new InputFilter.LengthFilter(3)});
                    builder.setView(input);

0

beste Lösung, die ich gefunden habe

textView.setText(text.substring(0,10));

Die Länge wird nicht begrenzt EditText, aber ein Text wird nach dem 10. Symbol (einmalig) abgeschnitten.
CoolMind

0

Um den ursprünglichen Eingabefilter beizubehalten, können Sie dies folgendermaßen tun:

InputFilter.LengthFilter maxLengthFilter = new InputFilter.LengthFilter(100);
        InputFilter[] origin = contentEt.getFilters();
        InputFilter[] newFilters;
        if (origin != null && origin.length > 0) {
            newFilters = new InputFilter[origin.length + 1];
            System.arraycopy(origin, 0, newFilters, 0, origin.length);
            newFilters[origin.length] = maxLengthFilter;
        } else {
            newFilters = new InputFilter[]{maxLengthFilter};
        }
        contentEt.setFilters(newFilters);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.