- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 TextInputLayout来自 Material Design library我们可以使用各种 end icon modes用于密码编辑、文本清除和自定义模式。此外,如果我们使用任何 Widget.MaterialComponents.TextInputLayout.*.ExposedDropdownMenu
样式,它会自动应用显示打开和关闭 V 形的特殊结束图标模式。
各种图标模式的例子:
考虑到结束图标的各种用例,我们决定在 InputTextLayout
中使用加载指示器,使其看起来像这样:
应该如何着手实现?
最佳答案
可以像这样简单地设置使用自定义可绘制对象来代替结束图标:
textInputLayout.endIconMode = TextInputLayout.END_ICON_CUSTOM
textInputLayout.endIconDrawable = progressDrawable
有问题的部分是获取可绘制的加载指示器。
没有可用于加载指示器的公共(public)可绘制资源。
有 android.R.drawable.progress_medium_material
但它被标记为私有(private)并且无法在代码中解析。将资源及其所有依赖的私有(private)资源复制到大约 6 个文件中(2 个可绘制对象 + 2 个动画师 + 2 个插值器)。这可能行得通,但感觉很像黑客。
我们可以使用 ProgressBar
来检索它的 indeterminateDrawable
。这种方法的问题在于可绘制对象与 ProgressBar
紧密相关。指示器仅在 ProgressBar
可见时才会显示动画,对一个 View 进行着色也会对另一个 View 中的指示器进行着色,并且可能会出现其他奇怪的行为。
在类似的情况下,我们可以使用 Drawable.mutate()
来获取可绘制对象的新副本。不幸的是,indeterminateDrawable
已经发生了变化,因此 mutate()
什么都不做。
真正使可绘制对象与 ProgressBar
分离的是对 indeterminateDrawable.constantState.newDrawable()
的调用。参见 documentation了解更多信息。
无论如何,这仍然感觉像是一个 hack。
虽然 drawable 资源被标记为私有(private),但我们可以解析某些主题属性以获取系统默认的加载指示器 drawable。该主题定义了 progressBarStyle
属性,该属性引用了 ProgressBar
的样式。此样式内部是引用主题可绘制对象的 indeterminateDrawable
属性。在代码中,我们可以像这样解析可绘制对象:
fun Context.getProgressBarDrawable(): Drawable {
val value = TypedValue()
theme.resolveAttribute(android.R.attr.progressBarStyleSmall, value, false)
val progressBarStyle = value.data
val attributes = intArrayOf(android.R.attr.indeterminateDrawable)
val array = obtainStyledAttributes(progressBarStyle, attributes)
val drawable = array.getDrawableOrThrow(0)
array.recycle()
return drawable
}
太好了,现在我们有了一个无需修改的原生加载指示器!
现在,如果您将可绘制对象插入此代码
textInputLayout.endIconMode = TextInputLayout.END_ICON_CUSTOM
textInputLayout.endIconDrawable = progressDrawable
你会发现它没有显示任何东西。
实际上,它确实正确显示了可绘制对象,但真正的问题是它没有被动画化。碰巧在动画开始时,drawable 折叠成一个不可见的点。
不幸的是,我们无法将 drawable 转换为它的真实类型 AnimationScaleListDrawable
,因为它在 com.android.internal.graphics.drawable
包中。对我们来说幸运的是,我们可以将其键入为 Animatable
和 start()
:
(drawable as? Animatable)?.start()
当 TextInputLayout
获得/失去焦点时,会发生另一种意外行为。在这种情况下,它将根据 layout.setEndIconTintList()
定义的颜色为可绘制对象着色。如果您没有明确指定色调列表,它会将可绘制对象着色为 ?colorPrimary
。但是在我们设置 drawable 的那一刻,它仍然着色为 ?colorAccent
并且在看似随机的时刻它会改变颜色。
出于这个原因,我建议使用相同的 ColorStateList
为 layout.endIconTintList
和 drawable.tintList
着色。如:
fun Context.fetchPrimaryColor(): Int {
val array = obtainStyledAttributes(intArrayOf(android.R.attr.colorPrimary))
val color = array.getColorOrThrow(0)
array.recycle()
return color
}
...
val states = ColorStateList(arrayOf(intArrayOf()), intArrayOf(fetchPrimaryColor()))
layout.setEndIconTintList(states)
drawable.setTintList(states)
最终我们得到这样的结果:
分别使用 android.R.attr.progressBarStyle
(中)和 android.R.attr.progressBarStyleSmall
。
关于android - 带有加载指示器的 TextInputLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57661168/
如何为登录表单制作圆角?这是我的代码: 尝试添加: style="@style/Widget.MaterialComponents.TextInputLayout.Outlined
我有一个简单的 TextInputLayout: 那我下面还有其他看法。 问题是,当我在 TextInputLayout 上设置错误时,高度会增加并插入下方的所有 View 。我尝试了一
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
有没有办法强制 TextInputLayout 错误消息占用一行? 我试图放置 app:errorTextAppearance="@style/error_appearance"在带有 error_a
在我的新 Android 应用程序中,TextInputLayout 的标 checkout 现在用户键入输入的空间中。这会导致输入的文本呈现在标签/提示的顶部: 当用户首次加载页面时: 当用户点击文
Android 的新 Material TextInputLayout 只支持boxed 和outlined 两种样式。 有没有办法切换到旧式(在支持库中) 最佳答案 您可以使用:
我注意到几天以来,我所有的 TextInputLayouts 始终启用“错误感叹号”。我已经很长时间没有对那些 TextInputLayouts 进行任何更改了,所以我真的不明白发生了什么。 这是它的
我有一个很长的文本,需要按照要求 float 在编辑文本上。我在这里经历了很多这样的问题,但找不到正确的答案。我们如何才能做到这一点?我尝试过使用带有提示字符串的“\n”,但它不起作用。 最佳答案 y
我正在尝试根据用户从 Spinner 中选择的数字添加带有 EditText 的 TextInputLayout。我已经在 XML 中定义了 TextInputLayout 属性,并希望能够根据用户从
我正在处理注册屏幕,它有多个 textInputLayout。在 onResume() 中,我将文本更改和焦点监听器添加到所有文本输入布局。在打开屏幕上,它工作正常,所有焦点和文本更改监听器都工作正常
不确定我遗漏了什么,但每次 edittext 聚焦时,下划线颜色都不会适应我设置的自定义颜色。引用这里是我的主题代码 @color/white @color/white @colo
当您单击 eddittext 时,有什么方法可以添加填充来提示吗?我尝试在 edittext 和 TextInputLayout 中添加填充和边距。 目前:
我是 Android 应用开发领域的新手。我目前正在尝试一些基本的东西。目前我正在尝试实现一个 float 标签,就像在各种 Material 设计应用程序中看到的那样。 我想要做的是获取一个 Car
我添加了 7+ TextInpuLayout 和父级 ScrollView 并且 TextInputLayout 在某些设备上只显示第一个后隐藏并且对于某些设备它工作得很好。为了更好地理解,这里有两个
我想在 android.support.design 中使用很棒的设计选项,但有一个问题。 当我在 TextInputLayout 中为我的 EditText 的 FocusChanged(andro
我在 textInputLayout 的 Activity 日志中缺少错误图标。不是那个时候发生,但现在只出现错误消息,而不是图标出现。 在我有一个表单的另一个 Activity 中,如果我出现了,但
我正在尝试创建一个与 Google 相册应用中的工具栏具有相似样式的搜索栏 - 即,带有阴影的圆角。 我们使用 Material 库中的 TextInputLayout 作为 fragment 的唯一
使用 TextInputLayout来自 Material Design library我们可以使用各种 end icon modes用于密码编辑、文本清除和自定义模式。此外,如果我们使用任何 Wid
我正在尝试将 TextInputLayout 实现到我的布局中。我有 3 个 EditText。我将每个包装在一个单独的 TextInputLayout 中。 它们不是分开,而是堆叠在一起。
我在 TextInputLayout 上有一个奇怪的错误。 com.google.android.material.textfield.TextInputEditText 的提示颜色在聚焦时变为白色。
我是一名优秀的程序员,十分优秀!