更改edittext光标颜色

如何以编程方式更改EditText's 光标颜色

在Android 4.0及以上版本中, 游标颜色为白色。 如果EditText的背景也是白色的,它将变得不可见。

在您的EditText属性中,有一个属性android:textCursorDrawable

现在把它设置为@null

android:textCursorDrawable="@null"

所以现在你的EditText光标和你的EditText TextColor是一样的。

参考从设置EditText光标颜色

我find了解决这个问题的方法。 这不是最好的解决scheme,但它的工作原理。

不幸的是,我只能使用静态颜色的光标颜色。

首先,我定义一个可绘制的黑色光标

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

接下来我在布局中定义一个示例EditText。

 <?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textCursorDrawable="@drawable/blackpipe" > </EditText> 

当我想在运行时创build一个EditText,我使用这个:

 AttributeSet editText30AttributeSet = null; int res = getResources().getIdentifier("edit30", "layout", getPackageName());//edit30 is EditText layout XmlPullParser parser = getResources().getXml(res); int state=0; do { try { state = parser.next(); } catch (Exception e1) { e1.printStackTrace(); } if (state == XmlPullParser.START_TAG) { if (parser.getName().equals("EditText")) { editText30AttributeSet = Xml.asAttributeSet(parser); break; } } } while(state != XmlPullParser.END_DOCUMENT); EditText view = new EditText(getContext(),editText30AttributeSet); 

现在你有一个EditText视图,它有一个黑色的光标。 也许有人可以改进我的解决scheme,以便游标可以在运行时更改。

这是,我认为,比@Adem发布的更好的解决scheme。

Java的:

 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:

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

那么使用AppCompat-v7的styles.xml呢?

 <item name="colorControlNormal">@color/accentColor</item> <item name="colorControlActivated">@color/accentColor</item> <item name="colorControlHighlight">@color/accentColor</item> 

适用于我(这个例子是简单的)。

改进Jared Rummler的答案

Java的:

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

在res / drawable文件夹中创buildcustom_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" /> 

XML:

 <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textCursorDrawable="@drawable/custom_cursor" > </EditText> 

所以,这里是最终版本 – 不需要XML,而是以编程方式工作:

 try { Field f = TextView.class.getDeclaredField("mCursorDrawableRes"); f.setAccessible(true); f.set((TextView)yourEditText, 0); } catch (Exception ignored) { } 

唯一的问题是,一些新版本的Android可能会停止工作。

PS我在4.1.2至5.1testing它。

您可以将android:textCursorDrawable属性设置为@null ,这将导致使用android:textColor作为光标颜色。

属性textCursorDrawable在API级别12和更高版本中可用

谢谢…