新的密码可见性切换为EditTexts打破了现有的drawableRight?

编辑我只是尝试了一个没有TextInputLayoutEditText ,它按预期工作。 所以这个问题必须在TextInputLayout有新的改变。

我已经使用一个自定义的EditText类作为一个TextInputLayout孩子大约一个月。 当用户键入时, x将出现在drawableRight字段中。 我已经成功地显示了drawableLeftdrawableTopdrawableBottom ,但是设置drawableRight为我提供了一个空白。 注意:单击X SHOULD所在的空白区域可以正常工作,文本被清除。

这第一张照片是它原来的样子:

在这里输入图像说明

自升级到support-v4:24.2.0 ,function已被打破。 它现在放置在带有drawableBottom的可绘制集合出现的“x”处。 第二张图片显示了新的行为:

在这里输入图像说明

XML代码

  <android.support.design.widget.TextInputLayout android:id="@+id/til_delivery_info_state" android:hint="@string/state_hint" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/large_margin" android:layout_marginRight="@dimen/large_margin"> <com.example.ui.edittexts.ClearableEditText android:id="@+id/et_state" android:inputType="textCapWords|text|textNoSuggestions" android:nextFocusDown="@+id/et_di_zip_code" android:text="@={deliveryViewModel.state}" android:gravity="center_vertical|left" android:singleLine="true" android:textSize="@dimen/text_size"/> </android.support.design.widget.TextInputLayout> 

Java的

  final Drawable drawable = ContextCompat.getDrawable(context, R.drawable.ic_clear_text_gray_x); final Drawable wrappedDrawable = DrawableCompat.wrap(drawable); mClearTextIcon.setBounds(0, 0, mClearTextIcon.getIntrinsicWidth(), mClearTextIcon.getIntrinsicHeight()); mClearTextIcon.setVisible(true, false); final Drawable[] compoundDrawables = getCompoundDrawables(); setCompoundDrawablesWithIntrinsicBounds( compoundDrawables[0], compoundDrawables[1], visible ? mClearTextIcon : null, compoundDrawables[3]); 

Solutions Collecting From Web of "新的密码可见性切换为EditTexts打破了现有的drawableRight?"

更新2016年9月14日

支持库24.2.1新版本已经过期,这个问题被标记为已修复。 根据更新日志

修复了问题:

TextInputLayout覆盖正确的复合drawable。 (AOSP问题220728)

原始答案

警告1这个答案将打破这个新的密码可见性切换function。

警告2更新支持库后,此答案可能会导致意外的行为(假设他们将解决此问题)。

看起来像TextInputLayout在这里updatePasswordToggleView东西,特别是从updatePasswordToggleView方法的这些行。

 final Drawable[] compounds = TextViewCompat.getCompoundDrawablesRelative(mEditText); TextViewCompat.setCompoundDrawablesRelative(mEditText, compounds[0], compounds[1], mPasswordToggleDummyDrawable, compounds[2]); 

正如你所看到的,它将mPasswordToggleDummyDrawable设置为一个right drawable,然后将bottom drawable的compounds[2] (这是你想要成为一个右边的自定义drawable)。

onMeasure方法中调用updatePasswordToggleView方法。 可能的解决方法是创build一个自定义的TextInputEditText并覆盖它的onMeasure方法。 我们称之为PassFixTextInputEditText

 public class PassFixTextInputEditText extends TextInputEditText { public PassFixTextInputEditText(final Context context) { super(context); } public PassFixTextInputEditText(final Context context, final AttributeSet attrs) { super(context, attrs); } public PassFixTextInputEditText(final Context context, final AttributeSet attrs, final int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); Drawable[] drawables = getCompoundDrawables(); setCompoundDrawables(drawables[0], drawables[1], drawables[3], null); } } 

像这样使用它

 <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:errorEnabled="true"> <com.kamilzych.temp.PassFixTextInputEditText android:id="@+id/textInputEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:maxLength="23"/> </android.support.design.widget.TextInputLayout> 

(不要忘记更改包名称)

正如你所看到的,在TextInputLayout将你的自定义drawable设置为底部drawable之后,我们将其设置为正确的。