API Q+ 上忽略 EditText 的自定义光标可绘制

问题描述 投票:0回答:3

我想将自定义可绘制对象设置为

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
方法使其可见,但仍然没有效果。

有人知道我做错了什么吗?

android android-edittext android-view
3个回答
4
投票

经过进一步调查,我发现

setTextCursorDrawable(@Nullable Drawable textCursorDrawable)
在每个
EditText
实例中只能工作一次。因此,如果您将 textCursorDrawable 更改为自定义的一次,则无法将其更改为另一种,它只会忽略您想要进行的任何更改。

我的屏幕具有默认状态,因此在屏幕初始化期间

setTextCursorDrawable
第一次更改了光标可绘制性,但我没有注意到。

因此请注意错误(或可能是预期的行为?),即您无法为每个

EditText
的一个实例多次更改光标可绘制对象。


0
投票

Mykola Tychyna 的代码有效。 牛鼻


-1
投票

如上所述,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)
}
© www.soinside.com 2019 - 2024. All rights reserved.