以编程方式设置textCursorDrawable

如果我在XML中添加EditText ,我可以设置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" /> 

现在我在Java中绘制一个EditText 。 我想设置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 ? 

如何设置?

Solutions Collecting From Web of "以编程方式设置textCursorDrawable"

没有公共API来设置光标可绘制。 您可以使用reflection以编程方式进行设置。 字段mCursorDrawableRes没有改变,所以这应该适用于所有设备,除非制造商改变了一些东西或稍后改变。

使用reflection设置光标:

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

定义一个可在你的应用程序中绘制的光标:

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

另一种方法:

您还可以使用以下方法设置光标颜色:

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

答案是———————>这是不可能的。

实际上,我在工作中遇到了这个问题,但是在查看了google的doc和源代码之后,我发现你不能在java代码中设置这个属性。

TextView类中你可以find下面的代码

 case com.android.internal.R.styleable.TextView_textCursorDrawable: mCursorDrawableRes = a.getResourceId(attr, 0); break; 

但是textCursorDrawable()方法只存在于R.attr ,如果你想设置这个属性,你只能通过在XML文件中包含一个editText来调用下面的构造方法。

 public EditText(Context context, AttributeSet attrs) { this(context, attrs, com.android.internal.R.attr.editTextStyle); } 

如果您使用AppCompat库并且您的Activity扩展了AppCompatActivity,则可以使用colorAccent的XML样式设置文本光标的颜色(对于所有EditText):

 <style name="AppTheme" parent="@style/Theme.AppCompat"> <item name="colorAccent">#FF4081</item> </style> 

这适用于Android 5+,并向后兼容从Android 4.4(API 19)到Android 4.0(API 14)的旧版Android版本。 注意:如果您使用的是AutoCompleteTextView,请确保它的任何自定义子类都扩展AppCompatAutoCompleteTextView,否则文本光标样式将不起作用。

另请参阅本指南,了解如何将颜色重音(色调)应用于对话框button: Android v21 Theme.Appcompat颜色重音被忽略,对话框上没有填充