如何以编程方式更改 EditText's 光标的颜色?
EditText's
在安卓4.0及以上版本中,光标颜色是白色的。如果 EditText的背景也是白色的,它就会变得不可见。
EditText
在 EditText 属性中,有一个属性 android:textCursorDrawable
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作为光标颜色。
@null
android:textColor
属性 textCursorDrawable可在 API 级别12和更高的..。
textCursorDrawable
谢谢..。
使用 AppCompat-v7的 styles.xml怎么样?
styles.xml
<item name="colorControlNormal">@color/accentColor</item> <item name="colorControlActivated">@color/accentColor</item> <item name="colorControlHighlight">@color/accentColor</item>
对我有用(这个例子过于简单化了)。
改进了 Jared Rummler 的回答
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:
<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>