我想将自定义可绘制对象设置为
EditText
的光标。
对于 API < Android Q I'm using reflection and it works like intended. Starting from Android Q we have convenient method
setTextCursorDrawable(@Nullable Drawable textCursorDrawable)
。我像下面这样使用它:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
textCursorDrawable = ContextCompat.getDrawable(context,R.drawable.drawable_cursor)!!.tintDrawable(color)
}
其中
tintDrawable
方法是:
private fun Drawable.tintDrawable(@ColorInt color: Int): Drawable {
return when (this) {
is VectorDrawableCompat -> this.apply { setTintList(ColorStateList.valueOf(color)) }
is VectorDrawable -> this.apply { setTintList(ColorStateList.valueOf(color)) }
else -> {
val wrappedDrawable = DrawableCompat.wrap(this)
DrawableCompat.setTint(wrappedDrawable, color)
DrawableCompat.unwrap(wrappedDrawable)
}
}
}
和
R.drawable.drawable_cursor
只是简单的矩形形状:
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<size android:width="2dp" />
<solid android:color="?android:textColorPrimary" />
</shape>
但是根本没有明显的效果。即使不应用着色光标可绘制也保持不变。
文档中提到
请注意,应用于光标 Drawable 的任何更改将不可见,直到光标被隐藏然后再次绘制。
所以我想我需要手动隐藏光标并通过
setCursorVisible
方法使其可见,但仍然没有效果。
有人知道我做错了什么吗?
经过进一步调查,我发现
setTextCursorDrawable(@Nullable Drawable textCursorDrawable)
在每个EditText
实例中只能工作一次。因此,如果您将 textCursorDrawable 更改为自定义的一次,则无法将其更改为另一种,它只会忽略您想要进行的任何更改。
我的屏幕具有默认状态,因此在屏幕初始化期间
setTextCursorDrawable
第一次更改了光标可绘制性,但我没有注意到。
因此请注意错误(或可能是预期的行为?),即您无法为每个
EditText
的一个实例多次更改光标可绘制对象。
Mykola Tychyna 的代码有效。 牛鼻
如上所述,Oleksii Yerastov textCursorDrawable 只能设置一次。这意味着您无法更改可绘制对象。但改变颜色不是问题。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val cursor = binding.textInputEditText.textCursorDrawable
cursor?.let {
when (it) {
is ShapeDrawable -> it.paint.color = textCursorColor
is GradientDrawable -> it.setColor(textCursorColor)
is ColorDrawable -> it.color = textCursorColor
}
} ?: run {
binding.textInputEditText.setTextCursorDrawable(textCursorDrawable)
}
} else {
val field = TextView::class.java.getDeclaredField("mCursorDrawableRes")
field.isAccessible = true
field.set(binding.textInputEditText, textCursorDrawable)
}