วิธีการตั้งค่า maxLength โดยทางโปรแกรมใน Android TextView?


177

ฉันต้องการตั้งค่าmaxLengthคุณสมบัติของโปรแกรมTextViewโดยที่ฉันไม่ต้องการให้รหัสในเค้าโครง ฉันไม่สามารถเห็นใด ๆวิธีการที่เกี่ยวข้องกับการsetmaxLength

ใครช่วยแนะนำฉันให้บรรลุถึงสิ่งนี้ได้บ้าง

คำตอบ:


364

ควรเป็นอะไรแบบนั้น แต่ไม่เคยใช้เป็น textview เพียง edittext:

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

119
การสร้างตามนั้นอาจจะดีกว่าที่จะไป: tv.setFilters (ใหม่ InputFilter [] {ใหม่ InputFilter.LengthFilter (10)});
Mark D

43
ไม่สามารถพูดคำว่า "maxLength ()" .. ไม่ไม่ไม่ไม่ .. ที่จะง่ายเกินไป พวกเขาต้องทำให้เป็นนามธรรม .. ใช่!
angryITguy

3
แต่สิ่งนี้จะรีเซ็ตตัวกรองก่อนหน้าของคุณใช่ไหม
crgarridos

20
ด้วย Kotlin คุณสามารถทำให้มันสะอาดขึ้น: editText.filters = arrayOf (InputFilter.LengthFilter (10))
Elvis Chidera

5
editText.filters = arrayOf(*editText.filters, InputFilter.LengthFilter(10))เก็บตัวกรองเก่าด้วย kotlin
Peter Samokhin

85

ลองสิ่งนี้

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

1
สิ่งนี้ใช้งานได้สำหรับฉัน แต่ใน Android 5.1 คุณยังคงสามารถพิมพ์ตัวอักษรต่อได้ แต่พวกเขาจะปรากฏในข้อเสนอข้อความ และเมื่อคุณพยายามลบตัวอักษรในตอนท้าย
Radon8472

11
นี่ไม่ใช่ "วิธีอื่น" นี่เป็นรุ่นสั้น ๆ ของคำตอบแรกเหมือนกัน
Ninja Coding


16

สำหรับคนที่คุณใช้ Kotlin

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

จากนั้นคุณสามารถใช้ editText.limitLength (10) ง่ายๆ


1
ทำไมไม่ใช้ setMaxLength เป็นชื่อฟังก์ชั่น คุณสามารถใช้มันกับ textview ได้ด้วย ... ขอบคุณ +1 :)
crgarridos

ฉันมีวิธีการอื่น ๆ ที่เป็นไปตามรูปแบบนี้: limitDecimalPaces, limitNumberOnly, limitAscii ที่จะไปพร้อมกับ limitLength
Kevin

1
ตัวกรอง = filters.plus (InputFilter.LengthFilter (สูงสุด)) อย่าเขียนทับสิ่งที่มีอยู่เดิม
ersin-ertan

7

ดังที่João Carlosกล่าวในการใช้ Kotlin:

editText.filters += InputFilter.LengthFilter(10)

ดูที่https://stackoverflow.com/a/58372842/2914140เกี่ยวกับอุปกรณ์บางอย่างที่มีพฤติกรรมแปลก ๆ

(เพิ่มandroid:inputType="textNoSuggestions"ของคุณEditText)


1
มันสร้างบั๊กถ้าคุณต้องการเปลี่ยนความยาวตอนหลังเหมือนในกรณีของฉันฉันเปลี่ยน MaxLength จาก 10 เป็น 20 แต่ในโค้ดเราเพิ่มตัวกรองมันตั้งค่า MaxLength 10 bcus ไว้ตอนนี้ในอาเรย์เรามีความยาวสูงสุด 10,20 สอง
Nikhil

@Nikhil เห็นด้วยกับคุณขอบคุณ! ใช่ในกรณีนี้เราควรลบตัวกรองหนึ่งตัว ( LengthFilter(10)) ก่อนแล้วจึงเพิ่มอันใหม่ ( LengthFilter(20))
CoolMind

6

สำหรับ Kotlin และโดยไม่ต้องรีเซ็ตตัวกรองก่อนหน้า:

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

ฉันสร้างฟังก์ชันเสริมอย่างง่ายสำหรับอันนี้

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

ทางออกที่ดีที่สุดที่ฉันพบ

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

มันจะไม่จำกัดความยาวEditTextแต่ตัดข้อความหลังสัญลักษณ์ที่ 10 (ครั้งเดียว)
CoolMind

0

ในการคงตัวกรองข้อมูลดั้งเดิมเอาไว้คุณสามารถทำได้ด้วยวิธีนี้:

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.