使用FrameLayout时TextInputLayout文本标头不见了

时间:2018-08-05 23:55:39

标签: android android-layout android-xml android-textinputlayout

这是我当前的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才能完成AutoCompleteTextView中的(x)清除按钮。

问题在于FrameLayout否定了TextInputLayout的作用,因此当用户输入文本或单击AutoCompleteTextView时,文本不会被向上推。

当前结果:(缺少电子邮件地址标题文本)

enter image description here

想要的结果:(我添加了一个x清除按钮,以显示不使用FrameLayout时缺少的内容)

enter image description here

2 个答案:

答案 0 :(得分:1)

TextInputLayout的某些内部行为与您对“正常” ViewGroup所期望的完全不一样。其中大多数没有记录,但是the Javadoc for the class itself确实告诉了您一些信息:

  

注意:保证TextInputLayout下存在的实际视图层次保证与XML编写的视图层次相匹配。结果,在getParent()的子级(例如TextInputLayout上调用TextInputEditText可能不会返回TextInputLayout本身,而是返回中间的{{1 }}。如果您需要直接访问View,请设置View并使用android:id

您应该避免的是,View#findViewById(int)可能会“重写”您声明的XML布局,并且您应该尽最大努力确保XML布局是通过TextInputLayout“期望”的方式设置的。

我相信您的特定问题源于您的XML布局未指定TextInputLayout的直接子元素的事实。如果您查看the source for TextInputLayout#addView(),将会看到以下内容:

EditText

由于您有一个TextInputLayout包装了@Override public void addView(View child, int index, final ViewGroup.LayoutParams params) { if (child instanceof EditText) { ... setEditText((EditText) child); } else { ... } } ,所以永远不会调用FrameLayout。因此,EditText的特殊功能将无法正常工作。

如何解决这个问题比较困难。我将从更改布局以使其具有此结构开始:

setEditText()

通过这种方式,您可以拥有“普通” TextInputLayout层次结构以清除文本的按钮。您需要做更多的工作来放置按钮,以便一切看起来自然,但这应该是一个可行的起点。

答案 1 :(得分:0)

我最终在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下方,并在按钮上使用负marginTop 以便将其设置在它需要设置。

结果:

enter image description here

注意:我使用RelativeLayout作为TextInputLayout的父级