更改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和更高版本中可用
谢谢…