Атрибут класса Editor не может быть найден через отражение - PullRequest
0 голосов
/ 14 ноября 2018

Я использую эмулятор с 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 debugging

Простодля любопытства я получил все объявленные поля этого класса Editor, и кажется, что доступно только восемь, и теперь я понятия не имею, что происходит в моем коде.enter image description here

...