更改编辑文本光标颜色

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

在安卓4.0及以上版本中,光标颜色是白色的。如果 EditText的背景也是白色的,它就会变得不可见。

75380 次浏览

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

现在把它设置成 @ null,

android:textCursorDrawable="@null"

现在您的 EditText 光标与 EditText TextColor 相同。

参考资料来自 设置 EditText 光标颜色

我找到了解决的办法,虽然不是最好的办法,但是很有效。

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

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

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

当我想在运行时创建 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 视图。也许有人可以改进我的解决方案,使光标可以在运行时更改。

我认为,这里有一个比@Adem 发布的更好的解决方案。

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>

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

属性 textCursorDrawable可在 API 级别12和更高的..。

谢谢..。

使用 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.custom_cursor);
} catch (Exception ignored) {
}

在 res/draable 文件夹中创建 custom_ 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>

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 并且以@null 的方式工作,但是以编程的方式:

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

唯一的问题是,它可能会在某一天停止使用某个新版本的 Android。

另外,我在4.1.2到5.1上测试了一下。

设置通过 AppTheme

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. -->
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:spinnerStyle">@style/spinner_style</item>
<!--Add This-->
<item name="editTextStyle">@style/EdittextStyle</item>
<item name="android:dropDownListViewStyle">@style/SpinnerStyle</item>
</style>


<!--New EditText Style-->
<style name="EdittextStyle" parent="Widget.AppCompat.EditText">
<item name="android:background">?attr/editTextBackground</item>
<item name="android:textColor">?attr/editTextColor</item>
<item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
<!--<item name="android:textCursorDrawable">@drawable/abc_text_cursor_material</item>-->
<item name="colorControlNormal">@color/colorAccent</item>
<item name="colorControlActivated">@color/colorAccent</item>
<item name="colorControlHighlight">@color/colorAccent</item>


</style>