我使用的是带有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()方法获取该字段时,抛出异常
Landroid / widget / Editor类中没有字段mDrawableForCursor; (“ android.widget.Editor”的声明出现在/system/framework/framework.jar!classes2.dex中)