没有公共API来设置光标可绘制.您可以使用反射以编程方式设置它.字段mCursorDrawableRes没有改变,因此这应该适用于所有设备,除非制造商更改了某些内容或稍后更改了.
使用反射设置光标:
EditText yourEditText = new EditText(context);
...
try {
// https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564
Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
f.setAccessible(true);
f.set(yourEditText,R.drawable.cursor);
} catch (Exception ignored) {
}
在您的应用中定义可绘制的光标:
android:shape="rectangle" >
另一种方法:
您还可以使用以下方法设置光标颜色:
public static void setCursorDrawableColor(EditText editText,int color) {
try {
Field fCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
fCursorDrawableRes.setAccessible(true);
int mCursorDrawableRes = fCursorDrawableRes.getInt(editText);
Field fEditor = TextView.class.getDeclaredField("mEditor");
fEditor.setAccessible(true);
Object editor = fEditor.get(editText);
Class> clazz = editor.getClass();
Field fCursorDrawable = clazz.getDeclaredField("mCursorDrawable");
fCursorDrawable.setAccessible(true);
Drawable[] drawables = new Drawable[2];
drawables[0] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
drawables[1] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
drawables[0].setColorFilter(color,PorterDuff.Mode.SRC_IN);
drawables[1].setColorFilter(color,PorterDuff.Mode.SRC_IN);
fCursorDrawable.set(editor,drawables);
} catch (Throwable ignored) {
}
}