Предположим, у нас есть простой EditText, и я хочу изменить курсор (каретку) на какой-то другой цвет, прежде чем мы использовали отражения для получения доступа к частным полям, но с появлением Android API Q (29) мы теперь можно использовать textCursorDrawable, чтобы установить возможность рисования для мигающего курсора.
Вот XML-код EditText
Теперь мы можем использовать WrapDrawable для обертывания ColorDrawable, который будет установлен как значение textCursorDrawable EditText, чтобы мы могли изменить цвет курсора.
Вот код WrapDrawable:
class WrapDrawable(color: Int) : Drawable() { частный var drawable = ColorDrawable (цвет) @ColorInt переменная цвета: Int = цвет набор (значение) { поле = значение рисуемый = ColorDrawable (значение) } переопределить fun setBounds(слева: Int, сверху: Int, справа: Int, снизу: Int) { super.setBounds(слева, сверху, справа, снизу) drawable.setBounds(слева, сверху, справа, снизу) } переопределить удовольствие getConstantState(): ConstantState? { вернуть drawable.constantState } переопределить fun setAlpha(alpha: Int) { drawable.alpha = альфа } переопределить fun setColorFilter(colorFilter: ColorFilter?) { drawable.colorFilter = цветной фильтр } переопределить удовольствие getOpacity(): Int { вернуть drawable.alpha } переопределить fun draw(canvas: Canvas) { drawable.draw(холст) } переопределить удовольствие getIntrinsicWidth(): Int { вернуть drawable.bounds.width() } переопределить удовольствие getIntrinsicHeight(): Int { вернуть drawable.bounds.height() } } В приведенном ниже коде мы дважды меняем цвет курсора: один раз на Color.RED и второй раз на Color.BLUE, теперь мы должны ожидать, что СИНИЙ курсор. Но проблема в том, что как только textCursorDrawable установлен, мы не можем его изменить, даже если попытаемся обнулить его.
class MainActivity : AppCompatActivity() { переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView (R.layout.activity_main) val text = findViewById(R.id.editText) если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // устанавливаем цвет курсора на КРАСНЫЙ text.textCursorDrawable = WrapDrawable(Color.RED).apply { setBounds(0, 0, 5, text.lineHeight) } // устанавливаем цвет курсора СИНИЙ !!! НЕ РАБОТАЕТ !!! text.textCursorDrawable = WrapDrawable(Color.BLUE).apply { setBounds(0, 0, 5, text.lineHeight) } } } }

Итак, мой вопрос: как мы можем переназначить значение textCursorDrawable несколько раз?
Я нашел обходной путь, обновив уже существующее значение textCursorDrawable и изменив ColorDrawable с помощью переменной цвета.
класс MainActivity : AppCompatActivity() { переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView (R.layout.activity_main) val text = findViewById(R.id.editText) если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // устанавливаем цвет курсора на КРАСНЫЙ text.textCursorDrawable = WrapDrawable(Color.RED).apply { setBounds(0, 0, 5, text.lineHeight) } // устанавливаем цвет курсора СИНИЙ text.textCursorDrawable?.let { если (это WrapDrawable) { it.color = Цвет.СИНИЙ it.setBounds(0, 0, 5, text.lineHeight) } } } } }