Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 新的密码可见性切换是否破坏了EditText的现有drawableRight?_Android_Android Edittext_Android Support Library_Android Drawable_Android Textinputlayout - Fatal编程技术网

Android 新的密码可见性切换是否破坏了EditText的现有drawableRight?

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>

EDIT我刚刚尝试了一个没有
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>