如何更改编程在android中的Edittext光标颜色?

在android中,我们可以通过以下方式更改光标颜色

android:textCursorDrawable="@drawable/black_color_cursor"

我们如何dynamic地做到这一点?

在我的情况下,我已经将光标设置为白色,但我需要改变黑色如何做?

  // Set an EditText view to get user input final EditText input = new EditText(nyactivity); input.setTextColor(getResources().getColor(R.color.black)); 

Solutions Collecting From Web of "如何更改编程在android中的Edittext光标颜色?"

使用一些reflection为我做了窍门

Java的:

 // 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); 

XML:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#ff000000" /> <size android:width="1dp" /> </shape> 

下面是一个你可以使用的不需要XML的方法:

 public static void setCursorColor(EditText view, @ColorInt int color) { try { // Get the cursor resource id Field field = TextView.class.getDeclaredField("mCursorDrawableRes"); field.setAccessible(true); int drawableResId = field.getInt(view); // Get the editor field = TextView.class.getDeclaredField("mEditor"); field.setAccessible(true); Object editor = field.get(view); // Get the drawable and set a color filter Drawable drawable = ContextCompat.getDrawable(view.getContext(), drawableResId); drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); Drawable[] drawables = {drawable, drawable}; // Set the drawables field = editor.getClass().getDeclaredField("mCursorDrawable"); field.setAccessible(true); field.set(editor, drawables); } catch (Exception ignored) { } } 

这是来自@Jared Rummler的函数的一个改写版本,有一些改进:

  • 支持Android 4.0.x
  • getDrawable(Context, int)的特殊getDrawable(Context, int)函数getDrawable(int)用于API 22及更高版本。
 private static final Field sEditorField, sCursorDrawableField, sCursorDrawableResourceField; static { Field editorField = null; Field cursorDrawableField = null; Field cursorDrawableResourceField = null; boolean exceptionThrown = false; try { cursorDrawableResourceField = TextView.class.getDeclaredField("mCursorDrawableRes"); cursorDrawableResourceField.setAccessible(true); final Class<?> drawableFieldClass; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { drawableFieldClass = TextView.class; } else { editorField = TextView.class.getDeclaredField("mEditor"); editorField.setAccessible(true); drawableFieldClass = editorField.getType(); } cursorDrawableField = drawableFieldClass.getDeclaredField("mCursorDrawable"); cursorDrawableField.setAccessible(true); } catch (Exception e) { exceptionThrown = true; } if (exceptionThrown) { sEditorField = null; sCursorDrawableField = null; sCursorDrawableResourceField = null; } else { sEditorField = editorField; sCursorDrawableField = cursorDrawableField; sCursorDrawableResourceField = cursorDrawableResourceField; } } public static void setCursorColor(EditText editText, int color) { if (sCursorDrawableField == null) { return; } try { final Drawable drawable = getDrawable(editText.getContext(), sCursorDrawableResourceField.getInt(editText)); drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); sCursorDrawableField.set(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN ? editText : sEditorField.get(editText), new Drawable[] {drawable, drawable}); } catch (Exception ignored) { } } private static Drawable getDrawable(Context context, int id) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return context.getResources().getDrawable(id); } else { return context.getDrawable(id); } } 
 android:textCursorDrawable="@null" 

然后在应用程序中:

 final EditText input = new EditText(nyactivity); input.setTextColor(getResources().getColor(R.color.black)); 

从这里开始

我们设法做到这一点:

  1. 用一个EditText创build一个布局文件,并在其上使用xml设置光标的颜色。
  2. 充气它
  3. 像使用EditText一样,使用编程方式创build一个EditText