Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

set textCursorDrawable programmatically

If I add an EditText in XML I can set textCursorDrawable="@null":

<EditText     android:id="@+id/txtE3Casecode4"     android:layout_width="30dp"     android:layout_height="wrap_content"     android:layout_alignParentTop="true"     android:background="#C7C7C5"     android:textCursorDrawable="@null"     android:ems="10"     android:inputType="number"     android:maxLength="2"     android:text="01"     android:textColor="#000000" /> 

Now I draw an EditText in Java. I want set android:textCursorDrawable="@null".

LinearLayout.LayoutParams paramtext = new LinearLayout.LayoutParams(     LinearLayout.LayoutParams.FILL_PARENT,     LinearLayout.LayoutParams.WRAP_CONTENT); EditText txtOther = new EditText(this); txtOther.setLayoutParams(paramtext); txtOther.setBackgroundColor(Color.WHITE); txtOther.setTextColor(Color.BLACK); txtOther.setId(99999); // txtOther.setCursorDrawable ?                                 

How do set it?

like image 275
D T Avatar asked Jul 19 '12 04:07

D T


1 Answers

Update 2019: There is no public API to set the cursor drawable. See https://stackoverflow.com/a/57555148/253468 for API available on 29 and above, before that conditionally you'll need to use reflection as described below.

Before API 29 you can set it programmatically by using reflection. The field mCursorDrawableRes hasn't changed so this should work on all devices, unless a manufacturer changed something or it is later changed.

Use reflection to set the cursor:

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) { } 

Define a cursor drawable in your app:

<?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> 

Another approach:

You can also set the cursor color with the following method:

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) {     }  }  
like image 71
Jared Rummler Avatar answered Sep 17 '22 11:09

Jared Rummler