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.

dineth
źródło

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

Dziekan
źródło
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.

star18bit
źródło
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.

Zach-M
źródło
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
R4j
źródło
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.

dineth
źródło
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) {
    }
}
Jared Rummler
źródło
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>
Charu ක
źródło
<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>
napływ
źródło
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.

Emily Alexandra Conroyd
źródło
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!

Wektor
źródło
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);
    }
}
Oliver Jonas
źródło
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.

Niamatullah Bakhshi
źródło
3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

W pliku XML ustaw kod edittextkoloru koloru tła

Avnish Titoriya
źródło
Wystarczy usunąć corsor, który miga w edycji tekstu
Avnish Titoriya 28.04.17
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.

JPhi Denis
źródło
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.

Xwaxes
źródło
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

Dave o Grady
źródło
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.

Clark będzie walczyć
źródło
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ść

denizuje
źródło
1

Użyj tego

android:textCursorDrawable="@color/white"
Mohammed Alzoubi
źródło
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.

Arnaud
źródło
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

Abhishek Saini
źródło
0

Jeśli używasz stylu i implementacji

colorControlActivate

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

latifalbr
źródło
0

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

android:textCursorDrawable="@color/red"
        android:textColor="@color/black
Tienanhvn
źródło
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 :)

Arnaud
źródło