Установить цвет курсора 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 атрибуты!

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

  1. Цвет нижней линии
  2. Цвет курсора
  3. Цвет указателя курсора (я использовал свое собственное изображение).......... из 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>

Использовать этот

андроид:textCursorDrawable="@ цвет / белый"

Для меня я изменил как 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
Другие вопросы по тегам