Я использую эмулятор с Android API 28 x86, и моя версия целевого / скомпилированного SDK проекта - 28. Имея это в виду, я могу приступить к реальной проблеме.
Я пытаюсьизменить цвет курсора EditText во время выполнения, используя отражение.Просматривая файлы SDK 28, я нашел имя поля, которое я хочу изменить, и это «mDrawableForCursor», это поле существует внутри класса Editor.Я не знаю почему, но этот класс нельзя отнести к моему проекту, но это не проблема, я тоже могу получить справку об этом через рефлексию.Итак, я написал следующий код
// Get the cursor resource id
Field field = TextView.class.getDeclaredField("mCursorDrawableRes");
field.setAccessible(true);
int drawableResId = field.getInt(this._inputEditText);
field.setAccessible(false);
// Get the editor
field = TextView.class.getDeclaredField("mEditor");
field.setAccessible(true);
Object editor = field.get(this._inputEditText);
field.setAccessible(false);
// Get the drawable and set a color filter
Drawable cursorPipe = ContextCompat.getDrawable(getContext(), drawableResId);
cursorPipe.setColorFilter(color, PorterDuff.Mode.SRC_IN);
Drawable[] drawables = {cursorPipe, cursorPipe};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
field = editor.getClass().getDeclaredField("mDrawableForCursor"); // error
} else {
field = editor.getClass().getDeclaredField("mCursorDrawable");
}
Теперь странные вещи начинают происходить ... Я поставил одну точку останова на объекте Editor и обнаружил, что там есть поле (последнее), но когда мойВ коде попробуйте получить это поле методом getDeclaredField (), генерируется исключение
Нет поля mDrawableForCursor в классе Landroid / widget / Editor;(объявление 'android.widget.Editor' появляется в /system/framework/framework.jar!classes2.dex)
Простодля любопытства я получил все объявленные поля этого класса Editor, и кажется, что доступно только восемь, и теперь я понятия не имею, что происходит в моем коде.