изменение цвета курсора edittext
Как я могу изменить EditText's
курсора цвет программно ?
В Android 4.0 и выше, цвет курсора белый. а если EditText
s фон также белый, он становится невидимым.
8 ответов:
в свойствах EditText есть атрибут
android:textCursorDrawable
теперь установите его в @null например,
android:textCursorDrawable="@null"
Итак, теперь ваш курсор EditText такой же, как и ваш EditText TextColor.
Справка установить цвет курсора EditText
Я нашел способ исправить это. Это не самое лучшее решение, но оно работает.
к сожалению, я могу использовать только статический цвет для цвета курсора.
во-первых, я определяю черный курсор в drawable
<?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>
а как же
styles.xml
С помощью AppCompat-v7?<item name="colorControlNormal">@color/accentColor</item> <item name="colorControlActivated">@color/accentColor</item> <item name="colorControlHighlight">@color/accentColor</item>
работает для меня (этот пример является упрощенным).
улучшение ответа Джареда Раммлера
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) { }
создать custom_cursor.xml в папке res/drawable:
<?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.
PS Я тестировал его на 4.1.2 до 5.1.
вы можете установить до
@null
это приведет к использованиюandroid:textColor
как цвет курсора.атрибут
textCursorDrawable
доступно в API уровня 12 и выше...спасибо...
Установить Через 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>