Android 新的密码可见性切换是否破坏了EditText的现有drawableRight?
EDIT我刚刚尝试了一个没有Android 新的密码可见性切换是否破坏了EditText的现有drawableRight?,android,android-edittext,android-support-library,android-drawable,android-textinputlayout,Android,Android Edittext,Android Support Library,Android Drawable,Android Textinputlayout,EDIT我刚刚尝试了一个没有TextInputLayout的EditText,它可以正常工作。因此,问题一定是TextInputLayout中的新更改 作为TextInputLayout的孩子,我已经使用了一个自定义的EditText类大约一个月了。当用户键入时,drawableRight字段中将出现一个x。我已成功显示了drawableLeft、drawableTop和drawableBottom的图像,但设置drawableRight会为我提供一个空白注释:< /强>单击空白处,代码> x>
TextInputLayout
的EditText
,它可以正常工作。因此,问题一定是TextInputLayout
中的新更改
作为TextInputLayout
的孩子,我已经使用了一个自定义的EditText
类大约一个月了。当用户键入时,drawableRight
字段中将出现一个x
。我已成功显示了drawableLeft
、drawableTop
和drawableBottom
的图像,但设置drawableRight
会为我提供一个空白<强>注释:< /强>单击空白处,<>代码> x>代码>应按预期工作,文本被清除。
第一张图片是它最初的样子:
自从升级到support-v4:24.2.0
后,该功能已中断。现在,它将“x”放置在应显示具有drawablebooth
的可绘制集的位置。第二张图片显示了新的行为:
XML代码
2016年9月14日更新
新版本的支持库24.2.1
已发布,此问题被标记为已修复。根据changelog
固定问题:
TextInputLayout替代右复合可绘制。(AOSP第220728期)
原始答案
警告1
此答案将破坏此新的密码可见性切换功能
警告2
此答案可能会在更新支持库后导致意外行为(假设他们将解决此问题)
看起来像是TextInputLayout
把事情搞砸了,特别是updatePasswordToggleView
方法中的这些行
final Drawable[] compounds = TextViewCompat.getCompoundDrawablesRelative(mEditText);
TextViewCompat.setCompoundDrawablesRelative(mEditText, compounds[0], compounds[1], mPasswordToggleDummyDrawable, compounds[2]);
如您所见,它将mpasswordtoggledummydravable
设置为right
drawable,然后将components[2]
设置为bottom
drawable
updatePasswordToggleView
方法是在onMeasure
方法中调用的。可能的解决方法是创建一个自定义的textinputtext
并覆盖它的onMeasure
方法。让我们称之为passfixtInputItemText
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
将您的自定义可绘制设置为底部可绘制后,我们将其设置为右侧可绘制。这里也一样,但我们不是唯一存在此问题的人:和。回答得很好。一段时间以来,我一直在提倡在编辑文本视图上使用clearable选项,所以看到支持库用最新的版本打破了它,我有点不高兴。看起来当你在ClearableEditText中覆盖on度量值时,你应该在设置复合可绘制项后调用super,否则它会为可绘制项留出空间,现在可绘制项从下到右移动。你知道他们是如何在密码图标btw上添加Hotspot/selectableItemBackground的吗?我觉得这也很重要在“x”图标上很有用。谢谢更新!我希望SO能通知我你已经更新了,我只是偶然发现了这个。还应该注意,TextViewCompat的行为。setCompoundDrawablesRelative()
在这里很重要,如果您以前使用的是textView.setCompoundDrawables()
它似乎不起作用,您必须使用相对版本
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>