Установить цвет курсора EditText - PullRequest
473 голосов
/ 30 августа 2011

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

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

Ответы [ 19 ]

1065 голосов
/ 06 февраля 2012

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

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

416 голосов
/ 15 марта 2013

В макете

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

59 голосов
/ 28 мая 2012

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

В вашем EditText используйте свойство:

android:textCursorDrawable="@drawable/black_cursor"

и добавьте отрисовываемый 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>

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

42 голосов
/ 20 марта 2015

Существует новый способ изменить цвет курсора в последних 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
38 голосов
/ 30 августа 2011

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

Я установил стиль editText темы:

<item name="android:editTextStyle">@style/myEditText</item>

Тогда я использовал следующую переменную, чтобы установить курсор:

`

<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 * Ключ 1014 * здесь.

24 голосов
/ 09 сентября 2015

Для тех, кому необходимо динамически установить цвет курсора 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) {
    }
}
10 голосов
/ 02 февраля 2017

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

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

Этот ответ демонстрирует, как изменить ......

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

enter image description here

<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>
8 голосов
/ 07 декабря 2016
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 голосов
/ 22 февраля 2016

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

4 голосов
/ 09 марта 2019

Здесь версия программного набора @Jared RummlerCursorDrawableColor () адаптирована для работы также на 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);
    }
}
...