Как ограничить ввод текста границами элемента Edittext

Имеется активность, на которой по задумке, друг за другом в горизонтальном расположении находятся два элемента Edittext вложенных в Linear layout, у всех ширина контролируется двумя атрибутами:

layout_width="match_parent" и layout_weight=" "

Соответственно на разных экранах, ширина элемента будет разная. Вопрос: как ограничить ввод текста в Edittext рамками элемента? Иначе при вводе длинного текста, он заезжает за "видимые" границы элемента и текст тупо не видно.

Атрибут maxLength не подойдёт - он жестко регламентирует количество возможных символов. Перенос строки на следующую тоже нет, все в одну строку должно быть.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <EditText
                android:id="@+id/ed_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:ems="10"
                android:inputType="textPersonName"
                android:text="Name_1" />

            <EditText
                android:id="@+id/ed_2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                android:ems="10"
                android:inputType="textPersonName"
                android:text="Name_2" />
        </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Ответы (1 шт):

Автор решения: Вася Воронцов

Я думаю, возможно использование TextWatcher:

final EditText et = (EditText) findViewById(R.id.et);
et.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    };
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (et.getLineCount() > 1) {
            et.setText(s.toString().substring(0, start));
            et.setSelection(start);
        };
    };
    @Override
    public void afterTextChanged(Editable s) {
    };
});

Если количество линий не будет равно 1, то убрать последний символ и перенести курсор в конец.

→ Ссылка