Bagaimana cara mengatur maxLength di Android TextView?


177

Saya ingin secara terprogram mengatur maxLengthproperti TextViewkarena saya tidak ingin kode keras dalam tata letak. Saya tidak dapat melihat setmetode apa pun yang terkait dengan maxLength.

Adakah yang bisa membimbing saya bagaimana mencapai ini?

Jawaban:


364

Seharusnya seperti itu. tetapi tidak pernah menggunakannya untuk tampilan teks, hanya edittext:

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

119
Membangun di atasnya, mungkin jauh lebih bersih untuk pergi: tv.setFilters (InputFilter baru [] {new InputFilter.LengthFilter (10)});
Mark D

43
Tidak bisa hanya mengatakan "maxLength ()" .. tidak, tidak, tidak .. itu terlalu mudah. mereka harus membuatnya abstrak .. yay!
angryITguy

3
Tapi ini akan mengatur ulang filter Anda sebelumnya, bukan?
crgarridos

20
Dengan Kotlin Anda dapat membuatnya lebih bersih: editText.filters = arrayOf (InputFilter.LengthFilter (10))
Elvis Chidera

5
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10))simpan filter lama dengan kotlin
Peter Samokhin

85

Coba ini

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

1
Ini berfungsi untuk saya, tetapi di Android 5.1 Anda masih dapat terus mengetik huruf, yang baru saja "tidak terlihat" di bidang input. Tetapi mereka ditampilkan dalam proposal teks. Dan ketika Anda mencoba untuk menghapus surat pada akhirnya.
Radon8472

11
Ini bukan "cara lain" ini adalah versi pendek dari jawaban pertama, dengan cara yang sama.
Ninja Coding

21

Cara mudah membatasi karakter teks edit :

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

16

Bagi Anda yang menggunakan Kotlin

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

Kemudian Anda bisa menggunakan editText.limitLength (10)


1
mengapa tidak menggunakan setMaxLength sebagai nama fungsi? Anda bisa menerapkan ini ke textview juga ... terima kasih +1 :)
crgarridos

Saya punya metode lain yang mengikuti pola ini: limitDecimalPlaces, limitNumberOnly, limitAscii untuk pergi bersama dengan limitLength.
Kevin

1
filter = filter.plus (InputFilter.LengthFilter (maks)) Jangan menimpa yang sudah ada
ersin-ertan

7

Seperti yang dikatakan João Carlos , di Kotlin gunakan:

editText.filters += InputFilter.LengthFilter(10)

Lihat juga https://stackoverflow.com/a/58372842/2914140 tentang perilaku aneh beberapa perangkat.

(Tambahkan android:inputType="textNoSuggestions"ke EditText.)


1
Ini membuat bug jika Anda ingin mengubah panjang yang terakhir seperti dalam kasus saya, saya mengubah MaxLength dari 10 menjadi 20, tetapi seperti dalam kode kita menambahkan filter tetap mengatur MaxLength 10 bcus sekarang dalam array kita memiliki 10.20 dua panjang max.
Nikhil

@ Nikhil, setuju dengan Anda, terima kasih! Ya, dalam hal ini pertama-tama kita harus menghapus satu filter ( LengthFilter(10)) dan kemudian menambahkan yang lain ( LengthFilter(20)).
CoolMind

6

Untuk Kotlin dan tanpa mengatur ulang filter sebelumnya:

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

Saya membuat fungsi ekstensi sederhana untuk yang ini

/**
 * 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

solusi terbaik yang saya temukan

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

Tidak akan membatasi panjangnya EditText, tetapi memotong teks setelah simbol ke-10 (satu kali).
CoolMind

0

Untuk mempertahankan filter input asli, Anda dapat melakukannya dengan cara ini:

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.