Встановіть колір курсору EditText


525

У мене виникає ця проблема, коли я використовую тему Holo для Android у проекті планшетів. Однак у мене є фрагмент на екрані, який має біле тло. Я додаю EditTextкомпонент на цей фрагмент. Я намагався змінити тему, встановивши фон ресурсів теми Holo.Light. Однак мій текстовий курсор (карат) залишається білим і, отже, непомітним на екрані (я можу його помітити слабко в полі редакційного тексту ..).

Хтось знає, як я можу отримати EditText використовувати темніший колір курсору? Я спробував встановити стиль EditText, щоб "@android:style/Widget.Holo.Light.EditText"не мати позитивного результату.

Відповіді:


1168

Якщо встановити android:textCursorDrawableатрибут, це @nullмає призвести до використання android:textColorкольору курсору.

Атрибут "textCursorDravable" доступний в API рівня 12 і вище


24
о людино, що настільки набагато ефективніше, ніж придумати чорновий для курсора чорний !! Я люблю Android до смерті, але це така неймовірно погана поведінка за замовчуванням ... когось насправді потрібно поцупити за це.
Євгеній Сімкін

26
android 3.2 і вище .. смокче
Blundell

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

Потім створіть 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
Атрибут "textCursorDravable" використовується лише в API рівня 12 і вище
mr.boyfox

64
Це правильна відповідь. Не впевнений, чому так багато людей думає, що встановити курсор на "@null" здається гарною ідеєю
Грег Енніс

1
вище відповідь, встановити textCursorDravable як @null результати виглядають нормально, але орієнтація курсору не має сенсу, однак ця відповідь справді чудова. Дійсно дякую
iroiroys

Чи можемо ми використовувати один і той же клас Excel з різними кольорами для курсору?
VVB

1
це найкраще рішення.
Antônio Sérgio Ferraz

71

Схоже, всі відповіді йдуть навколо кущів.

У ваших 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>

Це також спосіб створення більш різноманітних курсорів, якщо вам це потрібно.


3
Це не працює на Android 4.2 Jelly Bean ... Курсор зникає, @null - це шлях.
Едгар

@Edgar Це, здається, працює для мене на 4,2 Дж, просто на рівні тем.
mkuech

Android 4.2.2 працює чудово. Не забудьте додати <solid android: color = "# 000000" /> у black_cursor.xml
Андрій Аулашка

Атрибут "textCursorDravable" використовується лише в API рівня 12 і вище
mr.boyfox

53

Існує новий спосіб змінити колір курсору в останньому версії Appcompactv21
Просто змінити такий 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:

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. :)
vida

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

39

Я знайшов відповідь :)

Я встановив стиль 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>

`

андроїд: textCursorDravable - тут ключовий.


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"> ресурс) :

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

Тепер створіть доступний ( 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 єeditTextStyle
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"
    />

Потім створіть 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, і значення color.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>

Ось кольори.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="yellow">#B7EC2A</color>
</resources>

Я вийняв атрибут android: textCursorDravable до @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!


Для атрибутів потрібен рівень 21 API, а не 7 (2.1)
взуття

4

Тут версія програмного набору @Jred RummlerCursorDravableColor (), пристосована для роботи також на 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 -> значень -> styles.xml add

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

якщо його не існує



2

Тільки дійсний відповідь повинен змінити тему діяльності: <item name="colorAccent">#000000</item> Ви не повинні використовувати , android:textCursorDrawableщоб , @nullтому що це стосується тільки самого курсору , але не шпилька під курсором , якщо ви хочете , щоб перетягнути цей курсор. Тематичне рішення є найбільш серйозним.


2

Іншим простим рішенням буде перейти до res> values> color.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 та змініть колірний акцент, і це вплине на курсор у полі редагування тексту


1

Це навіть простіше, ніж це.

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

Це працює в ICS та за його межами. Я не перевіряв його в інших версіях.


3
будьте обережні, якщо ви збираєтеся застосувати цей стиль до свого EditText (у цьому відсутній батьківський стиль, який повинен бути типовим для вашої теми), ви втратите всі інші стилі, що походять з теми Holo.
Варун

Чи не те саме, що значення "@null"?
Пол Верест

Ви можете додати в подання стиль juste, який переосмислює тему діяльності.
JPhi Denis

1

Ви хочете певного кольору, ви повинні використовувати AppCompatEditText, а потім встановити нульове значення

працює для мене

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

Дивіться цю суть


1

Використовуй це

android:textCursorDrawable="@color/white"

2
Курсор зникає в моєму пристрої, тому використовуйте кнопок замість прямого встановлення кольору.
Фрукти

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>

всерединіCreate:

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.