这是我当前的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
时,文本不会被向上推。
当前结果:(缺少电子邮件地址标题文本)
想要的结果:(我添加了一个x清除按钮,以显示不使用FrameLayout
时缺少的内容)
答案 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 以便将其设置在它需要设置。
结果:
注意:我使用RelativeLayout
作为TextInputLayout
的父级