Définir la couleur du curseur EditText

526

J'ai ce problème où j'utilise le thème Holo d'Android sur un projet de tablette. Cependant, j'ai un fragment à l'écran qui a un fond blanc. J'ajoute un EditTextcomposant sur ce fragment. J'ai essayé de remplacer le thème en définissant l'arrière-plan des ressources du thème Holo.Light. Cependant, mon curseur de texte (carat) reste blanc et donc invisible à l'écran (je peux le repérer faiblement dans le champ edittext ..).

Est-ce que quelqu'un sait comment utiliser EditText pour utiliser une couleur de curseur plus sombre? J'ai essayé de définir le style de l'EditText "@android:style/Widget.Holo.Light.EditText"sans résultat positif.

dineth
la source

Réponses:

1170

La définition de l' android:textCursorDrawableattribut sur @nulldevrait entraîner l'utilisation de android:textColorcomme couleur de curseur.

L'attribut "textCursorDrawable" est disponible dans l'API niveau 12 et supérieur

doyen
la source
24
oh mec qui est tellement plus efficace que d'évoquer un dessinable pour que le curseur soit noir !! J'adore Android à mort, mais c'est un comportement par défaut incroyablement mauvais ... quelqu'un a vraiment besoin d'être frappé pour ça.
Yevgeny Simkin
26
android 3.2 et supérieur .. suce
Blundell
7
Bien que si vous target> 3.2 dans votre manifeste, vous pouvez l'utiliser et il sera ignoré pour les versions inférieures
Blundell
5
Semble utiliser la couleur de l'indice à la place si vous la définissez. Au moins sur 4.2. L'option de curseur n'a aucun problème pour moi du 2.3.3-4.4
MinceMan
5
Cela ne fonctionne pas dans les versions plus récentes d'Android. Au lieu de cela, il affiche un curseur gris et joue avec la fonctionnalité de surbrillance. Utilisez plutôt la réponse de @ star18bit.
Matthew Bahr
481

Dans la mise en page

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

Ensuite, créez 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>

Vous avez un curseur de couleur blanche sur la propriété EditText.

star18bit
la source
3
L'attribut "textCursorDrawable" n'est utilisé que dans les API de niveau 12 et supérieur
mr.boyfox
64
Ceci est la bonne réponse. Je ne sais pas pourquoi tant de gens pensent que placer le curseur sur "@null" semble être une bonne idée
Greg Ennis
1
au-dessus de la réponse, définissez textCursorDrawable car les résultats @null semblent bons, mais l'orientation du curseur n'a pas de sens, cependant, cette réponse fonctionne vraiment bien. Vraiment merci
iroiroys
Pouvons-nous utiliser le même Excel avec des couleurs différentes pour le curseur?
VVB
1
C'est la meilleure solution.
Antônio Sérgio Ferraz
71

Il semble que toutes les réponses tournent autour des buissons.

Dans votre EditText, utilisez la propriété:

android:textCursorDrawable="@drawable/black_cursor"

et ajoutez le drawable black_cursor.xmlà vos ressources, comme suit:

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

C'est également le moyen de créer des curseurs plus divers, si vous en avez besoin.

Zach-M
la source
3
Cela ne fonctionne pas sur Android 4.2 Jelly Bean ... Le curseur disparaît, @null est le chemin à parcourir.
Edgar
@Edgar Cela semble fonctionner pour moi sur 4.2 JB très bien au niveau des thèmes.
mkuech
Android 4.2.2 fonctionne bien. N'oubliez pas d'ajouter <solid android: color = "# 000000" /> dans black_cursor.xml
Andrei Aulaska
L'attribut "textCursorDrawable" n'est utilisé que dans l'API niveau 12 et supérieur
mr.boyfox
53

Il y a une nouvelle façon de changer la couleur du curseur dans la dernière Appcompactv21
Changez simplement colorAccentde style comme ceci:

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

Appliquez ensuite ce style sur le thème ou les activités de votre application.

Mise à jour : cette méthode ne fonctionne que sur l'API 21+
Mise à jour 2 : je ne suis pas sûr de la version minimale d'Android qu'elle peut fonctionner.
Testé par la version Android:

2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked
R4j
la source
1
J'ai bien peur que la réponse soit non. J'ai testé sur un périphérique API 18 et cela ne fonctionne pas.
R4j
1
Travailler sur mon Sony Experia. PreLollipop (4.4.4). Utilisant également la bibliothèque AppCompat. :)
vida
Ne fonctionne pas pour API 24 / Android 7.0. colorAccentchange par exemple la ligne en bas d'un EditTextmais elle ne touche pas la couleur réelle du curseur. Oh, et il n'y a plus de "v21" bien sûr.
Néph
39

J'ai trouvé la réponse :)

J'ai défini le style editText du thème sur:

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

Ensuite, j'ai utilisé le dessinable suivant pour définir le curseur:

"

<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 est la clé ici.

dineth
la source
3
stackoverflow.com/questions/2658772/android-vertical-line-xml peut être utile à tous ceux qui souhaitent rendre un curseur dessinable qui n'est qu'une ligne verticale :)
Andrew Wyld
1
pouvez-vous expliquer comment définir la couleur du curseur par programme
Anil MH
J'ai eu un problème lorsque j'ai nommé l'élément android:editTextStyle, mais en le modifiant pour le editTextStylerésoudre. Voir stackoverflow.com/a/34010235/6744473
chaussure
24

Pour ceux qui ont besoin de définir la EditTextcouleur du curseur de manière dynamique, vous trouverez ci-dessous deux façons d'y parvenir.


Créez d'abord votre curseur dessinable:

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

Définissez l'ID de ressource pouvant être dessiné par le curseur sur le dessin que vous avez créé (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) {
}

Pour simplement changer la couleur du curseur par défaut dessinable, vous pouvez utiliser la méthode suivante:

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
la source
Cela me dérange vraiment que cela fonctionne. AppCompatEditTextl'a déjà fait setSupportBackgroundTintList, donc ne serait-il pas assez simple d'ajouter quelque chose comme setSupportCursorTintList?
Joseph Piché
6
@Jared Rummler, votre solution a fonctionné pour le curseur, mais la gouttelette qui apparaît sous le curseur (lorsque vous sélectionnez le texte, il en apparaît deux) est toujours de la couleur d'origine. Peux-tu m'aider avec ceci?
Felipe Ribeiro R. Magalhaes
2
Votre 3. approche n'a pas fonctionné dans Android 9, mais elle est correcte pour les versions ci-dessous.
Muhammed Yalçın Kuru
11

Tard dans la soirée, voici ma réponse,

C'est pour les personnes qui ne cherchent pas à changer le colorAccentthème parent, mais qui veulent changer les EditTextattributs!

Cette réponse montre comment changer ......

  1. Couleur de la ligne de fond
  2. Couleur du curseur
  3. Couleur du pointeur du curseur (j'ai utilisé mon image personnalisée) .......... d' EditTextutiliser le style appliqué au thème Activité.

entrez la description de l'image ici

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

Exemple:

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

Maintenant, créez un drawable ( edit_text_background) ajoutez un ressource xml pour l'arrière-plan! Vous pouvez personnaliser comme vous le souhaitez!

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

Maintenant, comme vous avez défini ce style dans votre thème d'activité.

Exemple :

Dans votre activité, vous avez un thème, définissez-le sur ce editTextthème personnalisé .

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Your Theme data -->
    <item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
</style>
Charu ක
la source
<item name="editTextStyle">@style/AppTheme.EditText</item> // inculude thisaucun effet
act262
est-ce AppCompatEditText?
Charu
1
oh, je me trompe. J'ai écrit le mauvais attr android:editTextSteyle, le bon attr esteditTextStyle
act262
<item name="android:textCursorDrawable">@color/white</item>ne fonctionne pas
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"
    />

Ensuite, créez un 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>
afflux
la source
7

Pour moi, j'ai modifié à la fois l'AppTheme et une valeur 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>

Voici le colours.xml

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

J'ai retiré l'attribut android: textCursorDrawable à @null que j'ai placé dans le style editText. Lorsque j'ai essayé de l'utiliser, les couleurs ne changeaient pas.

Emily Alexandra Conroyd
la source
Oui, cela fonctionne, mais vous modifiez également d'autres éléments de thème lorsque vous n'avez besoin que de changer la couleur du curseur.
AlanKley
7

Wow, je suis vraiment en retard à cette fête, mais il y a eu une activité il y a 17 jours. Il semblerait que nous devions envisager de publier la version d'Android que nous utilisons pour une réponse.À partir de maintenant, cette réponse fonctionne avec Android 2.1 et supérieur. VALEURS / STYLES et ajoutez les lignes de code ci-dessous et votre curseur sera noir

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

Vous aurez besoin d'une ligne de code dans votre dossier RES / COLOR

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

Pourquoi poster si tard? Il pourrait être agréable d'envisager une forme de catégories pour le monstre à nombreuses têtes qu'Android est devenu!

Vecteur
la source
L'attribut nécessite un niveau d'API 21 et non 7 (2.1)
chaussure
4

Voici la version programmatique setCursorDrawableColor () de @Jared Rummler adaptée pour fonctionner également sur 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);
    }
}
Oliver Jonas
la source
1
java.lang.NoSuchFieldException: No field mDrawableForCursor sur Android 9.
zakjma
4

cela s'appelle colorAccentdans Android.

allez dans res -> values ​​-> styles.xml add

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

sinon existe.

Niamatullah Bakhshi
la source
3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

Dans le fichier xml, définissez le code de edittextcouleur de la couleur d'arrière - plan

Avnish Titoriya
la source
Il suffit de retirer le corsor qui clignote dans edittext
Avnish Titoriya
2

La seule réponse valable devrait être de changer le thème de l'activité: <item name="colorAccent">#000000</item> Vous ne devriez pas utiliser android:textCursorDrawablepour @nullparce que cela ne concerne que le curseur lui - même , mais pas la broche en dessous du curseur si vous souhaitez faire glisser ce curseur. La solution thématique est la plus sérieuse.

JPhi Denis
la source
2

Une autre solution simple serait d'aller dans res> values> colors.xml dans votre dossier de projet et de modifier la valeur de l'accent de couleur à la couleur que vous préférez

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

Le code ci-dessus change votre curseur en noir.

xwaxes
la source
Merci, c'est exactement ce que je cherchais
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>

Accédez à styles.xml et modifiez l'accentuation des couleurs, ce qui influencera le curseur de la zone edittext

dave o grady
la source
1

C'est encore plus facile que ça.

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

Cela fonctionne dans ICS et au-delà. Je ne l'ai pas testé dans d'autres versions.

Clark va se battre
la source
3
méfiez-vous, si vous allez appliquer ce style à votre EditText (cela n'a pas de style parent, qui devrait être le style par défaut se rapportant à votre thème), vous perdrez tous les autres styles qui viennent du thème Holo.
Varun
N'est-ce pas la même chose que la valeur "@null"?
Paul Verest
vous pouvez ajouter un style juste à une vue, ce qui remplace le thème de l'activité.
JPhi Denis
1

voulez-vous une couleur spécifique, vous devez utiliser AppCompatEditText puis backround définir null

travaille pour moi

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

Voir cet essentiel

denizs
la source
1

Utilisez ceci

android:textCursorDrawable="@color/white"
Mohammed Alzoubi
la source
2
Le curseur disparaît dans mon appareil, utilisez donc un dessinable au lieu de définir directement la couleur.
Fruit
1

Faites attention à votre colorAccent dans votre activité / fragment / dialogue actuel, défini dans Styles ...;) la couleur du curseur lui est liée.

Arnaud
la source
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" />

changer la couleur de colorAccent dans styles.xm, c'est simple

Abhishek Saini
la source
0

Si vous utilisez le style et implémentez

colorControlActivate

remplacer sa valeur autre que couleur / blanc.

latifalbr
la source
0

vous pouvez utiliser le code ci-dessous dans la mise en page

android:textCursorDrawable="@color/red"
        android:textColor="@color/black
Tienanhvn
la source
0

Après avoir passé beaucoup de temps à essayer toutes ces techniques dans une boîte de dialogue, j'ai finalement eu cette idée: attacher le thème à la boîte de dialogue elle-même et non à 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>

à l'intérieur onCreate:

public class myDialog étend Dialog {

private Activity activity;
private someVars;

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

à votre santé :)

Arnaud
la source