Imposta il colore del cursore EditText


525

Sto riscontrando questo problema in cui sto utilizzando il tema Holo di Android su un progetto tablet. Tuttavia, ho un frammento sullo schermo che ha uno sfondo bianco. Sto aggiungendo un EditTextcomponente su questo frammento. Ho provato a sovrascrivere il tema impostando lo sfondo delle risorse del tema Holo.Light. Tuttavia, il mio cursore di testo (carati) rimane bianco e quindi invisibile sullo schermo (posso individuarlo debolmente nel campo edittext ..).

Qualcuno sa come posso ottenere EditText per utilizzare un colore del cursore più scuro? Ho provato a impostare lo stile di EditText su "@android:style/Widget.Holo.Light.EditText"senza risultati positivi.

Risposte:


1169

L'impostazione android:textCursorDrawabledell'attributo su @nulldovrebbe comportare l'uso di android:textColorcome colore del cursore.

L'attributo "textCursorDrawable" è disponibile nel livello API 12 e versioni successive


24
oh amico che è molto più efficiente che evocare un disegno per rendere il cursore nero !! Adoro Android da morire, ma questo è un comportamento di default incredibilmente cattivo ... qualcuno ha davvero bisogno di essere colpito.
Evgenij Simkin il

26
Android 3.2 e versioni successive .. fa schifo
Blundell,

7
Sebbene se tu target> 3.2 nel tuo manifest puoi usarlo e verrà ignorato per le versioni inferiori
Blundell

5
Sembra invece usare il colore suggerimento se lo si imposta. Almeno il 4.2. L'opzione cursore non ha problemi per me dal 2.3.3-4.4
MinceMan

5
Questo non funziona nelle versioni più recenti di Android. Invece mostra un cursore grigio e si confonde con la funzionalità di evidenziazione. Usa invece la risposta di @ star18bit.
Matthew Bahr,

481

Nel layout

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

Quindi crea XML drawalble: 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>

Hai un cursore di colore bianco sulla proprietà EditText.


3
L'attributo "textCursorDrawable" viene utilizzato solo a partire dal livello API 12 e superiore
mr.boyfox

64
Questa è la risposta corretta Non sono sicuro del motivo per cui così tante persone là fuori pensano che impostare il cursore su "@null" sembra una buona idea
Greg Ennis,

1
sopra la risposta, imposta textCursorDrawable come i risultati di @null sembrano a posto, ma l'orientamento del cursore non ha senso, tuttavia, questa risposta funziona davvero alla grande. Grazie davvero
iroiroys il

Possiamo usare lo stesso Excel con colori diversi per il cursore?
VVB,

1
questa è la soluzione migliore.
Antônio Sérgio Ferraz,

71

Sembra che tutte le risposte vadano attorno ai cespugli.

Nel tuo EditText, usa la proprietà:

android:textCursorDrawable="@drawable/black_cursor"

e aggiungi il disegno black_cursor.xmlalle tue risorse, come segue:

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

Questo è anche il modo di creare cursori più diversi, se necessario.


3
Questo non funziona su Android 4.2 Jelly Bean ... Il cursore scompare, @null è la strada da percorrere.
Edgar,

@Edgar Questo sembra funzionare per me su 4.2 JB benissimo a livello di temi.
mkuech,

Android 4.2.2 funziona bene. Non dimenticare di aggiungere <solido android: color = "# 000000" /> in black_cursor.xml
Andrei Aulaska,

L'attributo "textCursorDrawable" viene utilizzato solo nel livello API 12 e versioni successive
mr.boyfox

53

C'è un nuovo modo per cambiare il colore del cursore nell'ultima Appcompactv21
Cambia semplicemente lo colorAccentstile in questo modo:

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

Quindi applica questo stile al tema o alle attività della tua app.

Aggiornamento : in questo modo funziona solo su API 21+
Aggiornamento 2 : non sono sicuro della versione minima di Android che possa funzionare.
Testato dalla versione Android:

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

1
Temo che la risposta sia no. Ho testato sul dispositivo API 18 e non funziona.
R4j,

1
Lavorando sul mio Sony Experia. PreLollipop (4.4.4). Anche usando la libreria AppCompat. :)
vida,

Non funziona per API 24 / Android 7.0. colorAccentcambia ad esempio la linea nella parte inferiore di un EditTextma non tocca il colore del cursore effettivo. Oh, e non c'è più "v21" ovviamente.
Neph

39

Ho trovato la risposta :)

Ho impostato lo stile editText del tema su:

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

Quindi ho usato il seguente disegno per impostare il cursore:

`

<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 è la chiave qui.


3
stackoverflow.com/questions/2658772/android-vertical-line-xml potrebbe essere utile a chiunque desideri creare un cursore che sia solo una linea verticale :)
Andrew Wyld,

1
puoi dire come possiamo impostare il colore del cursore in modo programmatico
Anil MH

Ho avuto un problema quando ho chiamato l'elemento android:editTextStyle, ma cambiandolo per editTextStylerisolverlo. Vedi stackoverflow.com/a/34010235/6744473
scarpa

24

Per chiunque abbia bisogno di impostare EditTextdinamicamente il colore del cursore, di seguito troverai due modi per raggiungere questo obiettivo.


Innanzitutto, crea il tuo cursore disegnabile:

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

Imposta l'ID della risorsa di disegno del cursore sul disegno che hai creato (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) {
}

Per cambiare semplicemente il colore del cursore di default che puoi disegnare, puoi usare il seguente metodo:

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

Mi dà davvero fastidio che funzioni. AppCompatEditTextlo ha già fatto setSupportBackgroundTintList, quindi non sarebbe abbastanza semplice aggiungere qualcosa del genere setSupportCursorTintList?
Joseph Piché,

6
@Jared Rummler la tua soluzione ha funzionato per il cursore, ma la goccia che appare sotto il cursore (quando selezioni il testo ne appare due) è ancora del colore originale. Puoi aiutarmi con questo?
Felipe Ribeiro R. Magalhaes,

2
Il tuo approccio 3. non ha funzionato in Android 9 ma va bene per le versioni sottostanti.
Muhammed Yalçın Kuru,

11

In ritardo alla festa, ecco la mia risposta,

Questo è per le persone che non vogliono cambiare il colorAccenttema principale, ma vogliono cambiare gli EditTextattributi!

Questa risposta mostra come cambiare ......

  1. Colore della linea di fondo
  2. Colore del cursore
  3. Colore del puntatore al cursore (ho usato la mia immagine personalizzata) .......... EditTextdell'uso dello stile applicato al tema Attività.

inserisci qui la descrizione dell'immagine

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

Esempio:

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

Ora crea un drawable ( edit_text_background) aggiungi una risorsa xml per lo sfondo! Puoi personalizzare come vuoi!

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

Ora come hai impostato questo stile nel tema Attività.

Esempio :

Nella tua attività hai un tema, imposta questo editTexttema personalizzato su quello.

<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 thisnessun effetto
act262

è AppCompatEditText?
Charu ක

1
oh, mi sbaglio. Ho scritto attr sbagliato android:editTextSteyle, giusto attr èeditTextStyle
act262

<item name="android:textCursorDrawable">@color/white</item>non funziona
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"
    />

Quindi crea XML drawalble: 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

Per me ho modificato sia AppTheme che un valore 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>

Ecco il colors.xml

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

Ho rimosso l'attributo android: textCursorDrawable per @null che ho inserito nello stile editText. Quando ho provato a usarlo, i colori non cambiano.


Sì, funziona, ma poi cambi anche altri elementi del tema quando tutto ciò di cui potresti aver bisogno è cambiare il colore del cursore.
AlanKley

7

Wow, sono davvero in ritardo a questa festa, ma ha avuto attività 17 giorni fa Sarebbe necessario considerare di pubblicare la versione di Android che stiamo usando per una risposta, quindi al momento questa risposta funziona con Android 2.1 e versioni successive Vai a RES / VALORI / STILI e aggiungi le righe di codice in basso e il cursore sarà nero

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

Avrai bisogno di questa riga di codice nella cartella RES / COLOR

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

Perché pubblicare questo in ritardo? Potrebbe essere bello considerare una qualche forma di categorie per il mostro dalle molte teste che Android è diventato!


L'attributo richiede il livello API 21 non 7 (2.1)
scarpa

4

Qui la versione setCursorDrawableColor () programmata di @Jared Rummler è stata adattata per funzionare anche su 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 su Android 9.
zakjma,

4

che si chiama colorAccentin Android.

vai a res -> valori -> styles.xml aggiungi

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

se non esiste.


3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

Nel file xml imposta il codice colore del edittextcolore di sfondo


Basta rimuovere il corsetto che lampeggia in edittext
Avnish Titoriya,

2

L'unica risposta valida dovrebbe essere quella di cambiare il tema dell'attività: <item name="colorAccent">#000000</item> Non dovresti usare il android:textCursorDrawableto @nullperché questo riguarda solo il cursore stesso ma non il perno sotto il cursore se vuoi trascinare quel cursore. La soluzione tematica è la più seria.


2

Un'altra soluzione semplice sarebbe quella di andare a res> valori> colors.xml nella cartella del progetto e modificare il valore dell'accento di colore sul colore che preferisci

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

Il codice sopra cambia il cursore in nero.


Grazie, è esattamente quello che stavo cercando
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>

Vai su styles.xml e cambia l'accento di colore e questo influenzerà il cursore dalla casella edittext


1

È ancora più facile di così.

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

Questo funziona in ICS e oltre. Non l'ho provato in altre versioni.


3
attenzione, se hai intenzione di applicare questo stile al tuo EditText (questo non ha uno stile genitore, che dovrebbe essere il predefinito relativo al tuo tema), perderai tutti gli altri stili che derivano dal tema Holo.
Varun,

Non è lo stesso del valore "@null"?
Paul Verest,

puoi aggiungere un juste di stile a una vista, che sostituisce il tema dell'attività.
JPhi Denis,

1

vuoi colore specifico devi usare AppCompatEditText quindi backround set null

per me va bene

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

Vedi questo riassunto


1

Usa questo

android:textCursorDrawable="@color/white"

2
Il cursore scompare nel mio dispositivo, quindi usa un disegno anziché impostare direttamente il colore.
Frutta,

1

Presta attenzione al tuo ColorAccent nella tua attività / frammento / finestra di dialogo corrente, definita in Stili ...;) il colore del cursore è correlato ad esso.


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

cambia il colore del colore Accento in styles.xm, è semplice


0

Se si utilizza stile e attrezzo

colorControlActivate

sostituire il suo valore diverso da quello di colore / bianco.


0

puoi usare il codice qui sotto nel layout

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

0

Dopo aver trascorso molto tempo a provare tutte queste tecniche in una finestra di dialogo, finalmente ho avuto questa idea: collegare il tema alla finestra di dialogo stessa e non a 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>

dentro onCreate:

myDialog di classe pubblica estende Dialog {

private Activity activity;
private someVars;

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

Saluti :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.