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?

UMAR-MOBITSOLUTIONS
quelle

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);
Sephy
quelle
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)});
IntelliJ Amiya
quelle
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)});
Farid Ahmed
quelle
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.

Kevin
quelle
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.)

CoolMind
quelle
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))
Santalu
quelle
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)
Kyriakos Georgiopoulos
quelle
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);
Nullzeiger-Ausnahme
quelle
0

beste Lösung, die ich gefunden habe

textView.setText(text.substring(0,10));
Sai Gopi N.
quelle
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);
hanswim
quelle