Установить цвет курсора EditText


526

У меня возникла проблема, когда я использую Android-тему Holo в проекте для планшета. Тем не менее, у меня есть фрагмент на экране, который имеет белый фон. Я добавляю EditTextкомпонент к этому фрагменту. Я попытался переопределить тему, установив фон для ресурсов темы Holo.Light. Тем не менее, мой текстовый курсор (карат) остается белым и, следовательно, невидимым на экране (я могу слегка заметить его в поле edittext ..).

Кто-нибудь знает, как я могу заставить EditText использовать более темный цвет курсора? Я попытался установить стиль EditText "@android:style/Widget.Holo.Light.EditText"без положительного результата.

Ответы:


1170

Установка android:textCursorDrawableатрибута @nullдолжна приводить к использованию в android:textColorкачестве цвета курсора.

Атрибут "textCursorDrawable" доступен в API уровня 12 и выше


24
о человек, который НАСТОЛЬКО гораздо эффективнее, чем придумывать рисование, чтобы курсор был черным !! Я до смерти люблю Android, но это невероятно плохое поведение по умолчанию ... кто-то действительно должен быть потрясен этим.
Евгений Симкин

26
Android 3.2 и выше .. отстой
Бланделл

7
Хотя, если вы target> 3.2 в своем манифесте, вы можете использовать его, и он будет игнорироваться для более низких версий
Blundell

5
Кажется, вместо этого используется цвет подсказки, если вы установите его. Как минимум на 4.2. С курсором у меня нет проблем с 2.3.3-4.4
MinceMan

5
Это не работает в более поздних версиях Android. Вместо этого он показывает серый курсор и портит функциональность выделения. Вместо этого используйте ответ @ star18bit.
Мэтью Бахр

481

В макете

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

У вас есть курсор белого цвета на свойство EditText.


3
Атрибут "textCursorDrawable" используется только в API уровня 12 и выше
mr.boyfox

64
Это правильный ответ. Не уверен, почему так много людей думают, что установка курсора на «@null» кажется хорошей идеей
Грег Эннис

1
Ответ выше, установите textCursorDrawable, так как результаты @null выглядят хорошо, но ориентация курсора не имеет смысла, однако, этот ответ работает очень хорошо. Действительно спасибо
iroiroys

Можем ли мы использовать один и тот же Excel с разными цветами для курсора?
ВВБ

1
это лучшее решение.
Антонио Сержиу Ферраз

71

Похоже, что все ответы идут вокруг кустов.

В вашем 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>

Это также способ создания более разнообразных курсоров, если вам нужно.


3
Это не работает на Android 4.2 Jelly Bean ... Курсор исчезает, @null это путь.
Эдгар

@ Edgar Это, кажется, работает для меня на 4.2 JB просто отлично на уровне тем.
mkuech

Android 4.2.2 работает нормально. Не забудьте добавить <solid android: color = "# 000000" /> в black_cursor.xml
Андрей Ауласка

Атрибут "textCursorDrawable" используется только в API уровня 12 и выше
mr.boyfox

53

В последней Appcompactверсии 21 появился новый способ изменить цвет курсора.
Просто измените 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

1
Боюсь, ответ - нет. Я тестировал на устройстве API 18, и оно не работает.
R4j

1
Работаю над моей Sony Experia. PreLollipop (4.4.4). Также с помощью библиотеки AppCompat. :)
Вид

Не работает для API 24 / Android 7.0. colorAccentизменяется, например, линия внизу, EditTextно это не касается фактического цвета курсора. О, и, конечно же, больше нет "v21".
Неф

39

Я нашел ответ :)

Я установил стиль 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 является ключом здесь.


3
stackoverflow.com/questions/2658772/android-vertical-line-xml может быть полезен всем, кто хочет сделать курсор нарисованным, это просто вертикальная линия :)
Andrew Wyld

1
Можете ли вы рассказать, как мы можем установить цвет курсора программно
Anil MH

У меня была проблема, когда я назвал предмет android:editTextStyle, но изменил его на editTextStyleисправленный. См. Stackoverflow.com/a/34010235/6744473
обувь

24

Для тех, кому нужно 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) {
    }
}

Меня действительно беспокоит, что это работает. AppCompatEditTextуже есть setSupportBackgroundTintList, так что не было бы довольно просто добавить что-то вроде setSupportCursorTintList?
Джозеф Пиче

6
@Jared Rummler ваше решение сработало для курсора, но капля, которая появляется под курсором (при выделении текста появляется два из них), все еще имеет оригинальный цвет. Можете ли вы помочь мне с этим?
Фелипе Рибейро Р. Магальес

2
Ваш подход 3. не работал в Android 9, но хорошо для следующих версий.
Мухаммед Ялчин Куру

11

Поздно на вечеринку, вот мой ответ,

Это для людей, которые не хотят менять colorAccentродительскую тему, но хотят изменить EditTextатрибуты!

Этот ответ демки как поменять ......

  1. Цвет нижней линии
  2. Цвет курсора
  3. Цвет указателя курсора (я использовал свое собственное изображение) .......... с EditTextиспользованием стиля, примененного к теме "Активность".

введите описание изображения здесь

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

<item name="editTextStyle">@style/AppTheme.EditText</item> // inculude thisбез эффекта
act262

это AppCompatEditText?
Чару

1
о, я ошибаюсь Я написал неправильный attr android:editTextSteyle, правильный attr iseditTextStyle
act262

<item name="android:textCursorDrawable">@color/white</item>не работает
Влад

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

7

Для меня я изменил как 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. Когда я попытался использовать это, цвета не изменились.


Да, это работает, но тогда вы также измените другие элементы темы, когда все, что вам может понадобиться, это изменить цвет курсора.
AlanKley

7

Ух, я очень опоздал на эту вечеринку, но у нее была активность 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!


Атрибут требует API уровня 21, а не 7 (2.1)
обувь

4

Вот программная версия @CaredRummDrawableColor () @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);
    }
}

1
java.lang.NoSuchFieldException: No field mDrawableForCursor на Android 9.
zakjma

4

это называется colorAccentв Android.

перейти к res -> values ​​-> styles.xml добавить

<item name="colorAccent">#FFFFFF</item>

если не существует


3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

В xml файле задайте код edittextцвета фона


Просто удалите мерцающий текст в редактируемом тексте
Avnish Titoriya

2

Единственный правильный ответ должен состоять в том, чтобы изменить тему упражнения: <item name="colorAccent">#000000</item> вы не должны использовать android:textCursorDrawableto, @nullпотому что это касается только курсора, но не контакта под курсором, если вы хотите перетащить этот курсор. Тематическое решение является наиболее серьезным.


2

Другое простое решение - перейти в res> values> colors.xml в папке вашего проекта и отредактировать значение цветового акцента в соответствии с тем цветом, который вы предпочитаете.

<color name="colorAccent">#000000</color>

Код выше меняет ваш курсор на черный.


Спасибо, это именно то, что я искал
Shivam Jha

2
<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 и измените цветовой акцент, и это будет влиять на курсор из поля edittext.


1

Это даже проще, чем это.

<style name="MyTextStyle">
    <item name="android:textCursorDrawable">#000000</item>
</style>

Это работает в ICS и за ее пределами. Я не проверял это в других версиях.


3
будьте осторожны, если вы собираетесь применить этот стиль к вашему EditText (у него нет родительского стиля, который должен быть по умолчанию для вашей темы), вы потеряете все другие стили, которые взяты из Holo Theme.
Варун

Разве это не то же самое, что значение "@null"?
Пол Верест

Вы можете добавить стиль к представлению, который переопределяет тему действия.
JPhi Денис

1

Вы хотите специфический цвет вы должны использовать AppCompatEditText тогда Backround набор нуль

работает для меня

<android.support.v7.widget.AppCompatEditText
    android:background="@null"
    android:textCursorDrawable="@color/cursorColor"/>

Смотрите эту суть



1

Обратите внимание на ваш colorAccent в вашей текущей деятельности / фрагменте / диалоге, определенный в стилях ...;) с ним связан цвет курсора.


0

<!-- 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, вот и все


0

Если использовать стиль и реализовать

colorControlActivate

заменить его значение другим, что цвет / белый.


0

Вы можете использовать код ниже в макете

android:textCursorDrawable="@color/red"
        android:textColor="@color/black

0

После того, как я потратил много времени, пытаясь использовать всю эту технику в диалоге, у меня наконец появилась идея: присоединить тему к самому диалогу, а не к 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>

внутри наСоздать:

открытый класс myDialog расширяет диалог {

private Activity activity;
private someVars;

public PopupFeedBack(Activity activity){
    super(activity, R.style.AppTheme_Dialog);
    setContentView(R.layout.myView);
    ....}}

ура :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.