Это мой текущий макет 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.
Текущий результат: (Отсутствует текст заголовка адреса электронной почты)
Требуемый результат: (я добавил кнопку x clear, чтобы показать, чего не хватает, если FrameLayout не используется)
Обратите внимание на этот github.com/rengwuxian/MaterialEditText. Вы можете изменить вид в соответствии с вашими требованиями.
У TextInputLayout есть некоторое внутреннее поведение, которое не совсем то, что вы ожидаете от "обычного" ViewGroup. Большая часть этого недокументирована, но Javadoc для самого класса кое-что вам сообщает:
Note: The actual view hierarchy present under
TextInputLayoutis NOT guaranteed to match the view hierarchy as written in XML. As a result, calls togetParent()on children of theTextInputLayout-- such as anTextInputEditText-- may not return theTextInputLayoutitself, but rather an intermediateView. If you need to access aViewdirectly, set anandroid:idand useView#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
В итоге я решил свой вопрос, используя следующее в моем 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
Отметьте это code.tutsplus.com/tutorials/…