In android we can change the cursor color via:
android:textCursorDrawable="@drawable/black_color_cursor"
.
How can we do this dynamically?
In my case I have set cursor drawable to white, but i need to change black How to do ?
// Set an EditText view to get user input final EditText input = new EditText(nyactivity); input.setTextColor(getResources().getColor(R.color.black));
Advertisement
Answer
Using some reflection did the trick for me
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>
Here is a method that you can use that doesn’t need an 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) { } }