Android Material 文本输入布局结束图标不可见但正常

Ami*_*bdi 4 xml user-interface android material-design textinputlayout

我最近发现了 Material Design TexInputLayout 的一个错误以及它使 endIcon 可见的方式。

假设您已正确设置所有内容并启用了结束图标,例如:

inputLayout.endIconMode == END_ICON_CLEAR_TEXT
Run Code Online (Sandbox Code Playgroud)

问题是,如果你定义一个 focusListener 像:

inputLayout.editText?.setOnFocusChangeListener { view, hasFocus -> ...}
Run Code Online (Sandbox Code Playgroud)

并导航到其中包含此 textInputLayout 的屏幕,其中包含一些已填充的文本,如下图所示

1

您会注意到 endIcon 没有显示,但如果您点击它应该在的位置,它就会起作用。

即使通过使其可见来确保它应该显示也inputLayout.isEndIconVisible = 无济于事。通过调试,您可以看到您点击了public void setEndIconVisible(boolean visible)真实值,但仍然没有使图标可见。

我找到了一个解决方案,我已将其作为答案发布。

Ami*_*bdi 8

问题是ClearTextEndIconDelegate有一个默认值OnFocusChangeListener,当您单击 editText 时,它会运行一个动画,通过它,私有/内部的 alpha 值endIconView(which holds the endIconDrawable)从 0 更改为 1。当您覆盖并设置自己的值时OnFocusChangeListener,您实际上会放弃此过程并设置inputLayout.isEndIconVisible = true启用视图,但您仍然看不到它。我没有找到任何方法来访问父视图并更改 Alpha。实际上你可以通过做类似的事情

(((inputLayout.getChildAt(0) as FrameLayout).getChildAt(2) as LinearLayout).getChildAt(1) as FrameLayout).getChildAt(0).alpha = 1f
Run Code Online (Sandbox Code Playgroud)

看看下面的图片,你就会明白我是如何结束上面的内容的:

在此输入图像描述

但这不是一个很好的解决方案,如果视图的层次结构发生变化,它将不再起作用。

最终解决方案

OnFocusChangeListener我带来的是在我的东西中调用原始内容,OnFocusChangeListener例如:

val originalListener = inputLayout.editText?.onFocusChangeListener
inputLayout.editText?.setOnFocusChangeListener { view, hasFocus ->
     originalListener?.onFocusChange(view, hasFocus)

     // do your thing here
}

Run Code Online (Sandbox Code Playgroud)