Установить цвет курсора EditText
У меня возникла проблема, когда я использую Android-тему Holo в проекте для планшета. Тем не менее, у меня есть фрагмент на экране, который имеет белый фон. Я добавляю EditText
компонент на этом фрагменте. Я попытался переопределить тему, установив фон для ресурсов темы Holo.Light. Тем не менее, мой текстовый курсор (карат) остается белым и, следовательно, невидимым на экране (я могу слегка заметить его в поле edittext..).
Кто-нибудь знает, как я могу заставить EditText использовать более темный цвет курсора? Я попытался установить стиль EditText в "@android:style/Widget.Holo.Light.EditText"
без положительного результата.
29 ответов
Настройка android:textCursorDrawable
приписывать @null
должно привести к использованию android:textColor
как цвет курсора.
Атрибут "textCursorDrawable" доступен в API уровня 12 и выше
В макете
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textCursorDrawable="@drawable/color_cursor"
/>
Затем создайте отрисовываемый xml: color_cursor
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<size android:width="3dp" />
<solid android:color="#FFFFFF" />
</shape>
У вас есть курсор белого цвета на свойство EditText.
Похоже, что все ответы идут вокруг кустов.
В вашем EditText
, используйте свойство:
android:textCursorDrawable="@drawable/black_cursor"
и добавить Drawable black_cursor.xml
на ваши ресурсы, а именно:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<size android:width="1dp" />
<solid android:color="#000000"/>
</shape>
Это также способ создавать более разнообразные курсоры, если вам нужно.
В последней версии появился новый способ изменения цвета курсора. Appcompact
v21
Просто поменяй colorAccent
в таком стиле:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Set theme colors from http://www.google.com/design/spec/style/color.html#color-color-palette-->
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">#088FC9</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">#088FC9</item>
<!-- colorAccent is used as the default value for colorControlActivated
which is used to tint widgets -->
<!-- THIS IS WHAT YOU'RE LOOKING FOR -->
<item name="colorAccent">#0091BC</item>
</style>
Затем примените этот стиль к теме или действиям вашего приложения.
Обновление: этот способ работает только на API 21+
Обновление 2: я не уверен, минимальная версия Android, что он может работать.
Проверено версией Android:
2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked
Я нашел ответ:)
Я установил стиль editText темы:
<item name="android:editTextStyle">@style/myEditText</item>
Затем я использовал следующий drawable для установки курсора:
`
<style name="myEditText" parent="@android:style/Widget.Holo.Light.EditText">
<item name="android:background">@android:drawable/editbox_background_normal</item>
<item name="android:textCursorDrawable">@android:drawable/my_cursor_drawable</item>
<item name="android:height">40sp</item>
</style>
`
android: textCursorDrawable является ключевым здесь.
Для тех, кому нужно установить 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>
Установите идентификатор ресурса рисования курсора в соответствии с созданным вами чертежом (https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564">source)):
try {
Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
f.setAccessible(true);
f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}
Чтобы просто изменить цвет отрисовываемого курсора по умолчанию, вы можете использовать следующий метод:
public static void setCursorDrawableColor(EditText editText, int color) {
try {
Field fCursorDrawableRes =
TextView.class.getDeclaredField("mCursorDrawableRes");
fCursorDrawableRes.setAccessible(true);
int mCursorDrawableRes = fCursorDrawableRes.getInt(editText);
Field fEditor = TextView.class.getDeclaredField("mEditor");
fEditor.setAccessible(true);
Object editor = fEditor.get(editText);
Class<?> clazz = editor.getClass();
Field fCursorDrawable = clazz.getDeclaredField("mCursorDrawable");
fCursorDrawable.setAccessible(true);
Drawable[] drawables = new Drawable[2];
Resources res = editText.getContext().getResources();
drawables[0] = res.getDrawable(mCursorDrawableRes);
drawables[1] = res.getDrawable(mCursorDrawableRes);
drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
fCursorDrawable.set(editor, drawables);
} catch (final Throwable ignored) {
}
}
Поздно на вечеринку, вот мой ответ,
Это для людей, которые не хотят менять colorAccent
в родительской теме, но хочет изменить EditText
атрибуты!
Этот ответ демки как поменять......
- Цвет нижней линии
- Цвет курсора
- Цвет указателя курсора (я использовал свое собственное изображение).......... из
EditText
используя стиль, примененный к теме Activity.
<android.support.v7.widget.AppCompatEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hey" />
Пример:
<style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
<item name="android:textColor">@color/white</item>
<item name="android:textColorHint">#8AFFFFFF</item>
<item name="android:background">@drawable/edit_text_background</item> // background (bottom line at this case)
<item name="android:textCursorDrawable">@color/white</item> // Cursor
<item name="android:textSelectHandle">@drawable/my_white_icon</item> // For pointer normal state and copy text state
<item name="android:textSelectHandleLeft">@drawable/my_white_icon</item>
<item name="android:textSelectHandleRight">@drawable/my_white_icon</item>
</style>
Теперь создайте Drawable (edit_text_background
) добавить ресурс XML для фона! Вы можете настроить, как вы хотите!
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="0dp"
android:left="-3dp"
android:right="-3dp"
android:top="-3dp">
<shape android:shape="rectangle">
<stroke
android:width="1dp"
android:color="@color/white"/>
</shape>
</item>
</layer-list>
Теперь, когда вы установили этот стиль в своей теме "Активность".
Пример:
В вашей деятельности у вас есть тема, установите этот пользовательский editText
тема к этому.
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Your Theme data -->
<item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
</style>
Ух, я очень опоздал на эту вечеринку, но у нее была активность 17 дней назад. Было бы похоже, что мы должны рассмотреть вопрос о том, какую версию Android мы используем для ответа, так что на данный момент этот ответ работает с Android 2.1 и выше. Перейти к RES/ ЦЕННОСТИ / СТИЛИ и добавьте строки кода ниже, и ваш курсор будет черным
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!--<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">-->
<!-- Customize your theme here. -->
<item name="colorControlActivated">@color/color_Black</item>
<!--Sets COLOR for the Cursor in EditText -->
</style>
Вам понадобится эта строка кода в папке RES/COLOR
<color name="color_Black">#000000</color>
Зачем так поздно? Возможно, было бы неплохо рассмотреть некоторую форму категорий для многоголового монстра, которым стал Android!
Edittext cursor color you want changes your color.
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textCursorDrawable="@drawable/color_cursor"
/>
Затем создайте drawalble xml: color_cursor
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<size android:width="3dp" />
<solid android:color="#FFFFFF" />
</shape>
Для меня я изменил как AppTheme, так и значение colors.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorControlNormal">@color/yellow</item>
<item name="colorAccent">@color/yellow</item>
</style>
Вот это colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="yellow">#B7EC2A</color>
</resources>
Я вынул атрибут android:textCursorDrawable для @null, который я поместил в стиль editText. Когда я попытался использовать это, цвета не изменились.
Мы можем сделать это в метериальной теме следующим образом:
<style name="Theme.App" parent="Theme.MaterialComponents.DayNight.NoActionBar">
...
<item name="android:colorControlNormal">#ff0000</item>
<item name="android:colorControlActivated">#ff0000</item>
<item name="android:colorControlHighlight">#ff0000</item>
...
</style>
И если вы хотите изменить цвет флажка и радио, добавьте следующую строку:
<item name="colorAccent">#ff0000</item>
Я тестировал Android API 21+
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimary</item>
<item name="colorAccent">@color/colorAccent</item> -- change this one
</style>
Перейдите в styles.xml и измените акцент цвета, и это повлияет на курсор в поле редактирования текста.
Вот программная версия @Cared RummDrawableColor() @Jared Rummler, адаптированная для работы также на Android 9 Pie.
@SuppressWarnings({"JavaReflectionMemberAccess", "deprecation"})
public static void setCursorDrawableColor(EditText editText, int color) {
try {
Field cursorDrawableResField = TextView.class.getDeclaredField("mCursorDrawableRes");
cursorDrawableResField.setAccessible(true);
int cursorDrawableRes = cursorDrawableResField.getInt(editText);
Field editorField = TextView.class.getDeclaredField("mEditor");
editorField.setAccessible(true);
Object editor = editorField.get(editText);
Class<?> clazz = editor.getClass();
Resources res = editText.getContext().getResources();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
Field drawableForCursorField = clazz.getDeclaredField("mDrawableForCursor");
drawableForCursorField.setAccessible(true);
Drawable drawable = res.getDrawable(cursorDrawableRes);
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
drawableForCursorField.set(editor, drawable);
} else {
Field cursorDrawableField = clazz.getDeclaredField("mCursorDrawable");
cursorDrawableField.setAccessible(true);
Drawable[] drawables = new Drawable[2];
drawables[0] = res.getDrawable(cursorDrawableRes);
drawables[1] = res.getDrawable(cursorDrawableRes);
drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
cursorDrawableField.set(editor, drawables);
}
} catch (Throwable t) {
Log.w(TAG, t);
}
}
Единственным правильным ответом должно быть изменение темы занятия: <item name="colorAccent">#000000</item>
Вы не должны использовать android:textCursorDrawable
в @null
потому что это касается только курсора, но не контакта под курсором, если вы хотите перетащить этот курсор. Тематическое решение является наиболее серьезным.
Это называется colorAccent
в Android.
перейти к res -> values -> styles.xml добавить
<item name="colorAccent">#FFFFFF</item>
если не существует
editcolor.xml
android:textCursorDrawable="@drawable/editcolor"
В файле XML установите код цвета edittext
фоновый цвет
Обратите внимание на ваш colorAccent в вашем текущем Activity/fragment/Dialog, определенный в Styles...;) цвет курсора связан с ним.
После большого количества времени, потраченного на опробование всех этих техник в диалоге, у меня наконец возникла идея: прикрепить тему к самому диалогу, а не к TextInputLayout.
<style name="AppTheme_Dialog" parent="Theme.AppCompat.Dialog">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorWhite</item>
<item name="colorAccent">@color/colorPrimary</item>
</style>
внутри onCreate:
открытый класс myDialog расширяет диалог {
private Activity activity;
private someVars;
public PopupFeedBack(Activity activity){
super(activity, R.style.AppTheme_Dialog);
setContentView(R.layout.myView);
....}}
ура:)
В API 21 и выше:
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:theme="@style/CursorColor">
// In colors.xml
<style name="CursorColor">
<item name="colorPrimary">@color/black</item>
</style>>
Другое простое решение - перейти в res>values>colors.xml в папке вашего проекта и отредактировать значение цветового акцента в соответствии с тем цветом, который вы предпочитаете.
<color name="colorAccent">#000000</color>
Код выше меняет ваш курсор на черный.
Это даже проще, чем это.
<style name="MyTextStyle">
<item name="android:textCursorDrawable">#000000</item>
</style>
Это работает в ICS и за ее пределами. Я не проверял это в других версиях.
2023 -Compose
Издание
Вы можете изменить цвет курсора с помощьюcursorBrush
.
Пример использования
BasicTextField(
...
cursorBrush = SolidColor(Transparent),
...
)
Если вы хотите определенный цвет, вы должны использовать AppCompatEditText, а затем установить фоновый ноль
работает для меня
<android.support.v7.widget.AppCompatEditText
android:background="@null"
android:textCursorDrawable="@color/cursorColor"/>
Смотрите эту суть
Вот как я это решил
Шаг 1. Обновите последние материалы
implementation 'com.google.android.material:material:1.1.0'
Шаг 2: введите ссылку TextInputLayout.OutlinedBox.Dense, Any...
<style name="TextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
<item name="boxStrokeColor">@color/app_color_main</item>
<item name="hintTextColor">@color/app_color_main</item>
<item name="android:theme">@style/exampleCursor</item>
</style>
Шаг 3: [важно изменить цвет курсора] — установите для свойства colorControlActivated желаемый цвет курсора.
<style name="exampleCursor" parent="ThemeOverlay.MaterialComponents.TextInputEditText.OutlinedBox">
<item name="colorControlActivated">@color/app_color_main</item>
</style>
подробнее здесь :
При использовании стиля и реализации
colorControlActivate
замените его значение другим цветом / белым.
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#36f0ff</item>
<item name="colorPrimaryDark">#007781</item>
<item name="colorAccent">#000</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
измените цвет colorAccent в styles.xm, вот и все
<style name="CustomTheme" parent="AppTheme">
<item name="colorAccent">@color/yourColor</item>
</style>
Добавьте это в стили, а затем в Edittext установите тему следующим образом:
android:theme="@style/CustomTheme"
Вот и все!
Вы можете использовать код ниже в макете
android:textCursorDrawable="@color/red"
android:textColor="@color/black