Как получить TextInputLayout, связанный с редактированием текста?

У меня есть много редактируемых текстов внутри разных TextInputLayouts. Как я могу получить TextInputLayout, где текст редактирования, с которым я работаю?

Пример :

@BindView(R.id.eT)
EditText eT;

@BindView(R.id.eT2)
EditText eT2;

@BindView(R.id.text_input_layout)
TextInputLayout textInputLayout;

@BindView(R.id.text_input_layout2)
TextInputLayout textInputLayout2;

я хочу что-то вроде eT.getTextInputLayout и получить textInputLayout

выдержка xml:

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

                <Spinner
                    android:id="@+id/spinner"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAlignment="center" />

                <android.support.design.widget.TextInputLayout
                    android:id="@+id/text_input_layout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"
                    app:errorTextAppearance="@style/error_appearance"
                    app:hintAnimationEnabled="true"
                    app:errorEnabled="true">

                <EditText
                    android:id="@+id/eT"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="number" />

                </android.support.design.widget.TextInputLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:orientation="horizontal"
                tools:layout_editor_absoluteX="8dp"
                tools:layout_editor_absoluteY="0dp">

                <TextView
                    android:id="@+id/tV"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:labelFor="@+id/spinne2"
                    android:text="@string/tarjeta" />

                <Spinner
                    android:id="@+id/spinner2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAlignment="center" />

            </LinearLayout>

            <android.support.design.widget.TextInputLayout
                android:id="@+id/text_input_layout2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"
                app:errorTextAppearance="@style/error_appearance"
                app:hintAnimationEnabled="true"
                app:errorEnabled="true">

                <EditText
                    android:id="@+id/eT2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:ems="10"
                    android:inputType="number" />
            </android.support.design.widget.TextInputLayout>
    </LinearLayout>

Я хочу получить, например, text_input_layout посредством редактирования текста eT для обработки ошибок в TIL (я делаю это в другом модуле, поэтому я не хочу передавать текст редактирования и TIL в этот модуль).


person MatiRC    schedule 04.08.2017    source источник
comment
Вы можете попробовать вызвать eT.getParent() и привести его, но, как написано в TextInputLayout, фактическая иерархия представлений, представленная в TextInputLayout, НЕ гарантирует соответствие иерархии представлений, записанной в XML. В результате вызовы getParent() для дочерних элементов TextInputLayout, таких как TextInputEditText, могут возвращать не сам TextInputLayout, а промежуточное представление. Если вам нужен прямой доступ к представлению, установите android:id и используйте findViewById(int).   -  person yasin    schedule 04.08.2017
comment
можешь выложить файл макета?   -  person Mani    schedule 05.08.2017
comment
done @Mani, я думаю создать что-то вроде хэша с текстом редактирования => TIL, поэтому я передаю хэш другому модулю ...   -  person MatiRC    schedule 07.08.2017
comment
Почему не подход @yasin? Его более чистый подход с вашей текущей структурой макета   -  person Mani    schedule 08.08.2017
comment
@Mani, потому что мне нужен TIL для создания сообщения об ошибке (например, textInputLayout.setError(ERROR), когда я нашел error.in дочернем тексте редактирования, поэтому мне нужно это отношение, и если я правильно понимаю, getParent НЕ гарантирует возврат TIL. Что я делаю в другом модуле, так это получаю текст редактирования и список TIL, поэтому, когда eT обнаруживает ошибку, вызывается setError, я не хочу объявлять с помощью findViewById, поэтому я могу использовать этот метод с различными макетами   -  person MatiRC    schedule 09.08.2017


Ответы (3)


@Сами-Исса прав

edittext.getParent().getParent() 

возвращает TextInputLayout

person LutfiTekin    schedule 07.01.2020

Примечание. Фактическая иерархия представлений, присутствующая в TextInputLayout, НЕ гарантирует соответствие иерархии представлений, записанной в XML. В результате вызовы getParent() для дочерних элементов TextInputLayout, таких как TextInputEditText, могут возвращать не сам TextInputLayout, а промежуточное представление. Если вам нужен прямой доступ к представлению, установите android:id и используйте findViewById(int). https://developer.android.com/reference/android/support/design/widget/TextInputLayout

но если вы все еще хотите это сделать, вы можете сделать это, используя такой метод:

private static TextInputLayout findTextInputLayoutParent(View view) {
    return findTextInputLayoutParent(view.getParent(), 3);
}

private static TextInputLayout findTextInputLayoutParent(ViewParent view, int maxDepth) {
    if (view.getParent() instanceof TextInputLayout) {
        return (TextInputLayout) view.getParent();
    } else if (maxDepth > 0){
        return findTextInputLayoutParent(view.getParent(), maxDepth -1);
    }
    return null;
}
person Alécio Carvalho    schedule 21.02.2020

Вы можете вызвать getParentForAccessibility для View или EditText, чтобы получить ссылку TextInputLayout для этого View, если этот View находится внутри TextInputLayout

person zulkarnain shah    schedule 20.07.2018
comment
Не работает. Для каждого TextView getParentForAccessibility возвращает компонент макета (FrameLayout или ScrollLayout). - person Sami Issa; 26.11.2018
comment
@СамиИсса. Вот почему в моем ответе говорится, находится ли этот вид внутри TextInputLayout. Это означает, что прямым родителем рассматриваемого представления должен быть TextInputLayout, чтобы это решение работало. - person zulkarnain shah; 26.11.2018
comment
У меня есть FrameLayout, который содержит TextInputLayout, а он содержит TextInputEditText. Когда я вызываю TextInputLayout.getParentForAccessibility(), он возвращает FrameLayout. Наконец, я решил не элегантным способом, но работает. TextInputLayout.getParent().getParent(). Я не горжусь этим :) - person Sami Issa; 27.11.2018
comment
@zulkarnain Пожалуйста, приведите пример, как получить TextInputLayout с помощью getParentForAccessibility внутри расширенного EditText! Благодарю вас! - person Abigail La'Fay; 27.05.2019