Ustaw kolor kursora EditText


525

Mam ten problem, w którym używam motywu Holo Androida w projekcie tabletu. Mam jednak fragment na ekranie, który ma białe tło. Dodaję EditTextkomponent do tego fragmentu. Próbowałem zastąpić motyw, ustawiając tło zasobów motywu Holo.Light. Jednak mój kursor tekstowy (karat) pozostaje biały, a zatem niewidoczny na ekranie (mogę go słabo dostrzec w polu edycyjnym ...).

Czy ktoś wie, jak mogę zmusić EditText do używania ciemniejszego koloru kursora? Próbowałem ustawić styl EditText na "@android:style/Widget.Holo.Light.EditText"bez pozytywnego wyniku.

Odpowiedzi:


1168

Ustawienie android:textCursorDrawableatrybutu na @nullpowinno spowodować użycie android:textColorjako koloru kursora.

Atrybut „textCursorDrawable” jest dostępny na poziomie API 12 i wyższym


24
och, człowieku, który jest TAK znacznie bardziej wydajny niż wyczarowanie rysowalnego kursora, aby był czarny !! Uwielbiam Androida na śmierć, ale jest to tak niewiarygodnie złe zachowanie domyślne ... ktoś naprawdę musi zostać za to uderzony.
Jewgienij Simkin

26
Android 3.2 i nowszy ... do bani
Blundell

7
Chociaż jeśli targetw swoim manifeście masz > 3,2, możesz go użyć i będzie on ignorowany w niższych wersjach
Blundell,

5
Wydaje się używać zamiast tego koloru podpowiedzi, jeśli go ustawisz. Przynajmniej w 4.2. Opcja kursora nie ma dla mnie problemów od 2.3.3-4.4
MinceMan

5
To nie działa w nowszych wersjach Androida. Zamiast tego pokazuje szary kursor i bałagan z funkcją podświetlania. Zamiast tego użyj odpowiedzi @ star18bit.
Matthew Bahr

481

W układzie

<EditText  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textCursorDrawable="@drawable/color_cursor"
    />

Następnie utwórz 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>

Kursor ma biały kolor we właściwości EditText.


3
Atrybut „textCursorDrawable” jest używany tylko w interfejsie API poziomu 12 i wyższym
mr.boyfox

64
To jest poprawna odpowiedź. Nie jestem pewien, dlaczego tak wielu ludzi uważa, że ​​ustawienie kursora na „@null” wydaje się dobrym pomysłem
Greg Ennis

1
powyżej odpowiedzi ustaw textCursorDrawable, ponieważ wyniki @ null wyglądają dobrze, ale orientacja kursora nie ma sensu, jednak ta odpowiedź działa naprawdę świetnie. Naprawdę dziękuję
iroiroys,

Czy możemy używać tego samego programu Excel z różnymi kolorami kursora?
VVB

1
to najlepsze rozwiązanie.
Antônio Sérgio Ferraz

71

Wygląda na to, że wszystkie odpowiedzi krążą w krzakach.

W swoim EditTextużyj właściwości:

android:textCursorDrawable="@drawable/black_cursor"

i dodaj drawable black_cursor.xmldo swoich zasobów w następujący sposób:

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

Jest to również sposób na tworzenie bardziej różnorodnych kursorów, jeśli potrzebujesz.


3
To nie działa na Androidzie 4.2 Jelly Bean ... Kursor znika, @null to droga.
Edgar

@Edgar To wydaje się działać dla mnie w wersji 4.2 JB w porządku na poziomie motywów.
mkuech

Android 4.2.2 działa dobrze. Nie zapomnij dodać <solid android: color = "# 000000" /> w black_cursor.xml
Andrei Aulaska

Atrybut „textCursorDrawable” jest używany tylko w interfejsie API poziomu 12 i wyższym
mr.boyfox

53

Istnieje nowy sposób zmiany koloru kursora w najnowszej Appcompactwersji 21
Zmień colorAccentstyl w następujący sposób:

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

Następnie zastosuj ten styl do motywu aplikacji lub działań.

Aktualizacja : w ten sposób działa tylko w interfejsie API 21+
Aktualizacja 2 : Nie jestem pewien, która minimalna wersja Androida może działać.
Testowane przez wersję Androida:

2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked

1
Obawiam się, że odpowiedź brzmi „nie”. Testowałem na urządzeniu API 18 i to nie działa.
R4j

1
Pracuję nad moim Sony Experia. PreLollipop (4.4.4). Również przy użyciu biblioteki AppCompat. :)
vida

Nie działa dla API 24 / Android 7.0. colorAccentzmienia np. linię na dole, EditTextale nie dotyka rzeczywistego koloru kursora. Aha, i oczywiście nie ma już „v21”.
Nef

39

Znalazłem odpowiedź :)

Ustawiłem styl edycji tekstu motywu na:

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

Następnie użyłem następującego rysunku do ustawienia kursora:

`

<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 jest tutaj kluczem.


3
stackoverflow.com/questions/2658772/android-vertical-line-xml może być przydatny każdemu, kto chce ustawić kursor jako linię pionową :)
Andrew Wyld

1
czy możesz powiedzieć, w jaki sposób możemy programowo ustawić kolor kursora
Anil MH

Miałem problem, gdy nazwałem przedmiot android:editTextStyle, ale zmieniłem go, aby editTextStylego naprawić. Zobacz stackoverflow.com/a/34010235/6744473
but

24

Dla każdego, kto musi EditTextdynamicznie ustawić kolor kursora, poniżej znajdziesz dwa sposoby na osiągnięcie tego.


Najpierw utwórz kursor do rysowania:

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

Ustaw identyfikator zasobu rysowalnego kursora na utworzony przez ciebie rysunkowy (https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564"> źródło)) :

try {
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

Aby tylko zmienić kolor domyślnego rysowalnego kursora, możesz użyć następującej metody:

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) {
    }
}

Naprawdę przeszkadza mi, że to działa. AppCompatEditTextjuż ma setSupportBackgroundTintList, więc czy dodanie czegoś takiego nie byłoby dość proste setSupportCursorTintList?
Joseph Piché,

6
@Jared Rummler twoje rozwiązanie działało dla kursora, ale kropla pojawiająca się pod kursorem (po zaznaczeniu tekstu wydaje się, że dwa z nich) nadal ma oryginalny kolor. czy możesz mi z tym pomóc?
Felipe Ribeiro R. Magalhaes

2
Twoje 3. podejście nie działało w Androidzie 9, ale dobrze w przypadku poniższych wersji.
Muhammed Yalçın Kuru

11

Późno na imprezę, oto moja odpowiedź,

To jest dla ludzi, którzy nie chcą zmienić colorAccentmotywu nadrzędnego, ale chcą zmienić EditTextatrybuty!

Ta wersja demonstracyjna odpowiedzi jak zmienić ......

  1. Kolor dolnej linii
  2. Kolor kursora
  3. Kolor wskaźnika kursora (użyłem własnego obrazu) .......... EditTextużywania stylu zastosowanego do motywu działania.

wprowadź opis zdjęcia tutaj

<android.support.v7.widget.AppCompatEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hey" />

Przykład:

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

Teraz utwórz plik rysunkowy ( edit_text_background) i dodaj xml zasobu do tła! Możesz dostosować, jak chcesz!

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

Teraz, gdy ustawiłeś ten styl w motywie Aktywność.

Przykład:

W swoim działaniu masz motyw, ustaw do niego ten niestandardowy editTextmotyw.

<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 thisbez efektu
akt 262

czy to AppCompatEditText?
Charu ක

1
och, mylę się. Napisałem zły attr android:editTextSteyle, właściwy editTextStyle
att

<item name="android:textCursorDrawable">@color/white</item>nie działa
Vlad

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

Następnie utwórz xml ciągliwy: 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

Dla mnie zmodyfikowałem zarówno AppTheme, jak i wartość 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>

Oto colors.xml

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

Wyjąłem atrybut android: textCursorDrawable do @null, który umieściłem w stylu editText. Gdy spróbowałem tego użyć, kolory się nie zmieniły.


Tak, to działa, ale następnie zmieniasz także inne elementy motywu, gdy wszystko, czego potrzebujesz, to zmienić kolor kursora.
AlanKley

7

Wow, jestem naprawdę spóźniony na tę imprezę, ale miała aktywność 17 dni temu. Szew musiałby rozważyć opublikowanie jakiej wersji Androida używamy do odpowiedzi, więc na razie ta odpowiedź działa z Androidem 2.1 i nowszym Przejdź do RES / WARTOŚCI / STYLE i dodaj poniższe wiersze kodu, a kursor będzie czarny

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

Będziesz potrzebował tego wiersza kodu w folderze RES / COLOR

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

Po co publikować tak późno? Przyjemnie byłoby rozważyć jakąś kategorię kategorii potwora, którym stał się Android!


Atrybut wymaga interfejsu API na poziomie 21, a nie 7 (2.1)
but

4

Tutaj programowa wersja setCursorDrawableColor () @Jareda Rummlera przystosowana do pracy również na Androidzie 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 na Androida 9.
zakjma,

4

to się nazywa colorAccentw Androidzie.

przejdź do res -> wartości -> dodaj style.xml

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

jeśli nie istnieje.



2

Jedyną prawidłową odpowiedzią powinna być zmiana tematu działania: <item name="colorAccent">#000000</item> Nie powinieneś używać android:textCursorDrawabledo, @nullponieważ dotyczy to samego kursora, ale nie szpilki pod kursorem, jeśli chcesz przeciągnąć ten kursor. Rozwiązanie tematyczne jest najpoważniejsze.


2

Innym prostym rozwiązaniem byłoby przejście do res> wartości> colors.xml w folderze projektu i edycja wartości akcentu kolorystycznego na preferowany kolor

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

Powyższy kod zmienia kursor na czarny.


Dzięki, właśnie tego szukałem
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>

Przejdź do styles.xml i zmień akcent kolorystyczny, a to wpłynie na kursor z pola edycyjnego


1

To nawet łatwiejsze niż to.

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

Działa to w ICS i nie tylko. Nie testowałem tego w innych wersjach.


3
uwaga, jeśli zamierzasz zastosować ten styl do tekstu EditText (nie ma on stylu nadrzędnego, który powinien być domyślny dla Twojego motywu), stracisz wszystkie inne style, które pochodzą z motywu Holo.
Varun

Czy to nie to samo, co wartość „@ null”?
Paul Verest

możesz dodać juste stylu do widoku, który przesłania motyw działania.
JPhi Denis,

1

czy chcesz określonego koloru, musisz użyć AppCompatEditText, a następnie ustawić backround na null

pracuje dla mnie

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

Zobacz tę treść


1

Użyj tego

android:textCursorDrawable="@color/white"

2
Kursor znika w moim urządzeniu, więc użyj rysowalnego zamiast bezpośredniego ustawienia koloru.
Fruit

1

Zwróć uwagę na swój kolor Procent w bieżącym działaniu / fragmencie / oknie dialogowym zdefiniowanym w Style ...;) kolor kursora jest z nim powiązany.


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

zmień kolor colorAccent w styles.xm, to proste


0

Jeśli używasz stylu i implementacji

colorControlActivate

zamień jego wartość na inną niż kolor / biały.


0

możesz użyć kodu poniżej w układzie

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

0

Po długim czasie spędzonym na wypróbowywaniu wszystkich tych technik w oknie dialogowym, w końcu wpadłem na ten pomysł: dołącz temat do samego okna dialogowego, a nie do 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>

wewnątrz na Utwórz:

myDialog klasy publicznej rozszerza Dialog {

private Activity activity;
private someVars;

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

Twoje zdrowie :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.