Ограничить длину текста EditText в Android

Вызов любых методов public , static , non-final в конструкторе, зависит от вас, но наилучшей практикой является никогда не вызывать такие методы внутри конструктора, потому что эти методы могут быть переопределены в подклассах и на самом деле будет вызываться только переопределенная версия этих методов (если вы используете полиморфное поведение).

Например:

public class Foo {

public Foo() {
    doSmth(); // If you use polymorphic behavior this method will never be invoked
}

public void doSmth() {
    System.out.println("doSmth in super class");
}

public static void main(String[] args) {
    new Bar(200);
}
}

class Bar extends Foo {

private int y;;

public Bar(int y) {
    this.y = y;
}

@Override
public void doSmth() { // This version will be invoked even before Barr object initialized
    System.out.println(y);
}

}

Он будет печатать 0.

Для подробных сведений читайте Брюс Эккель «Мышление в Java» глава «Полиморфизм»

630
задан hpique 19 July 2010 в 21:55
поделиться

3 ответа

1288
ответ дан 22 November 2019 в 21:49
поделиться

Я мог сделать это просто:

<EditText
    android:id="@+id/ID"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLength="NUMBER"
    android:hint="A Hint" />
0
ответ дан Lighteninger 28 July 2019 в 17:16
поделиться
  • 1
    Действительно. Я видел точку связать функции, если Вы могли бы передать диапазон в, но... Вы can' t. – Hobbo 1 March 2009 в 09:07

Kotlin:

edit_text.filters += InputFilter.LengthFilter(10)

ZTE Blade A520 имеет странный эффект. Когда Вы вводите больше чем 10 символов (например, 15), EditText шоу сначала 10, но другие 5 не видимы и не доступны. Но когда Вы удаляете символы с Backspace, это сначала удаляет правильные 5 символов и затем удаляет оставление 10. Для преодоления этого поведения используют это.

private class EditTextWatcher(private val view: EditText) : TextWatcher {
    private var position = 0
    private var oldText = ""

    override fun afterTextChanged(s: Editable?) = Unit

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        oldText = s?.toString() ?: ""
        position = view.selectionStart
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        val newText = s?.toString() ?: ""
        if (newText.length > 10) {
            with(view) {
                setText(oldText)
                position = if (start > 0 && count > 2) {
                    // Text paste in nonempty field.
                    start
                } else {
                    if (position in 1..10 + 1) {
                        // Symbol paste in the beginning or middle of the field.
                        position - 1
                    } else {
                        if (start > 0) {
                            // Adding symbol to the end of the field.
                            start - 1
                        } else {
                            // Text paste in the empty field.
                            0
                        }
                    }
                }
                setSelection(position)
            }
        }
    }
}

// Usage:
editTextWatcher = EditTextWatcher(view.edit_text)
view.edit_text.addTextChangedListener(editTextWatcher)
0
ответ дан 22 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: