Текстовый заголовок TextInputLayout пропал при использовании FrameLayout

Это мой текущий макет xml:

<android.support.design.widget.TextInputLayout
                    android:id = "@+id/emailAddressLayout"
                    android:layout_width = "match_parent"
                    android:layout_height = "wrap_content"
                    android:layout_marginTop = "20dp"
                    android:focusable = "true"
                    android:clickable = "true">

                    <FrameLayout
                        android:layout_width = "match_parent"
                        android:layout_height = "wrap_content"
                        android:layout_marginTop = "9dp"
                        android:padding = "5dp"
                        android:focusable = "false"
                        android:clickable = "false">

                        <AutoCompleteTextView
                            android:id = "@+id/emailAddress"
                            android:layout_width = "match_parent"
                            android:layout_height = "wrap_content"
                            android:focusableInTouchMode = "true"
                            android:hint = "email address"
                            android:inputType = "textEmailAddress"
                            android:imeOptions = "actionNext"
                            android:maxLines = "1" />

                    <Button
                        android:id = "@+id/emailTextClearButton"
                        android:layout_width = "20dp"
                        android:layout_height = "20dp"
                        android:layout_marginRight = "5dp"
                        android:layout_marginEnd = "5dp"
                        android:layout_gravity = "end|center_vertical"
                        android:background = "@drawable/ic_clear_black_svg" />

                    </FrameLayout>

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

Мне нужен мой FrameLayout для выполнения кнопки очистки (x) в моем AutoCompleteTextView.

Проблема в том, что FrameLayout сводит на нет эффект TextInputLayout, поэтому текст не выдвигается вверх, когда пользователь вводит текст или нажимает на AutoCompleteTextView.

Текущий результат: (Отсутствует текст заголовка адреса электронной почты)

Текстовый заголовок TextInputLayout пропал при использовании FrameLayout

Требуемый результат: (я добавил кнопку x clear, чтобы показать, чего не хватает, если FrameLayout не используется)

Текстовый заголовок TextInputLayout пропал при использовании FrameLayout

Отметьте это code.tutsplus.com/tutorials/…

Crammeur 06.08.2018 06:07

Обратите внимание на этот github.com/rengwuxian/MaterialEditText. Вы можете изменить вид в соответствии с вашими требованиями.

Sunny 06.08.2018 06:43
3
2
400
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У TextInputLayout есть некоторое внутреннее поведение, которое не совсем то, что вы ожидаете от "обычного" ViewGroup. Большая часть этого недокументирована, но Javadoc для самого класса кое-что вам сообщает:

Note: The actual view hierarchy present under TextInputLayout is NOT guaranteed to match the view hierarchy as written in XML. As a result, calls to getParent() on children of the TextInputLayout -- such as an TextInputEditText -- may not return the TextInputLayout itself, but rather an intermediate View. If you need to access a View directly, set an android:id and use View#findViewById(int).

Что вы должны убрать из этого, так это то, что TextInputLayout потенциально "перезапишет" ваш объявленный XML-макет и также, что вы должны сделать все возможное, чтобы убедиться, что ваш XML-макет настроен так, как "ожидает" TextInputLayout.

Я считаю, что ваша конкретная проблема проистекает из того факта, что ваш XML-макет не определяет EditText, который является прямым потомком TextInputLayout. Если вы посмотрите на источник для TextInputLayout#addView(), вы увидите это:

@Override
public void addView(View child, int index, final ViewGroup.LayoutParams params) {
    if (child instanceof EditText) {
        ...
        setEditText((EditText) child);
    } else {
        ...
    }
}

Поскольку у вас есть FrameLayout, обертывающий EditText, этот вызов setEditText() никогда не выполняется. Следовательно, никакие специальные функции TextInputLayout работать не будут.

Как решить этот вопрос - более сложный вопрос. Я бы начал с изменения вашего макета, чтобы вместо этого была эта структура:

<FrameLayout>
    <TextInputLayout>
        <EditText/>
    </TextInputLayout>
    <Button/>
</FrameLayout>

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

Да, в итоге я использовал такую ​​работу: stackoverflow.com/a/51714083/5544859

Red M 06.08.2018 21:03
Ответ принят как подходящий

В итоге я решил свой вопрос, используя следующее в моем XML:

<android.support.design.widget.TextInputLayout
                    android:id = "@+id/emailAddressTextInput"
                    android:layout_width = "match_parent"
                    android:layout_height = "wrap_content"
                    android:layout_marginTop = "10dp">

                        <AutoCompleteTextView
                            android:id = "@+id/emailAddress"
                            style = "@style/body_text_style"
                            android:layout_width = "match_parent"
                            android:layout_height = "wrap_content"
                            android:clickable = "true"
                            android:focusable = "true"
                            android:focusableInTouchMode = "true"
                            android:hint = "@string/prompt_email_address"
                            android:imeOptions = "actionNext"
                            android:inputType = "textEmailAddress"
                            android:maxLines = "1"/>

                        <!--work around solution using negative marginTop-->
                        <Button
                            android:id = "@+id/emailTextClearButton"
                            android:layout_width = "20dp"
                            android:layout_height = "20dp"
                            android:layout_gravity = "end|center_vertical"
                            android:layout_alignParentRight = "true"
                            android:layout_alignParentEnd = "true"
                            android:layout_centerVertical = "true"
                            android:layout_marginEnd = "5dp"
                            android:layout_marginRight = "5dp"
                            //work around solution
                            android:layout_marginTop = "-32dp"
                            android:background = "@drawable/ic_clear_black_svg"/>

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

РЕШЕНИЕ должен установить мой button под моим AutoCompleteTextView и использовать отрицательная маржа на кнопке, чтобы иметь возможность установить его там, где он должен быть установлен.

Результат:

Примечание: Я использую RelativeLayout как родительский для TextInputLayout

Другие вопросы по теме