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?

UMAR-MOBITSOLUSI
sumber

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

Bagi Anda yang menggunakan Kotlin

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

Kemudian Anda bisa menggunakan editText.limitLength (10)

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

CoolMind
sumber
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))
santalu
sumber
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)
Kyriakos Georgiopoulos
sumber
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);
Pengecualian Null Pointer
sumber
0

solusi terbaik yang saya temukan

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