web-dev-qa-db-fra.com

Définir la couleur du curseur EditText

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 composant EditText sur ce fragment. J'ai essayé de remplacer le thème en définissant l'arrière-plan des ressources de thème Holo.Light. Cependant, mon curseur de texte (carat) reste blanc et donc invisible à l’écran (je ne le vois que faiblement dans le champ edittext ..).

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

452
dineth

Définir l'attribut Android:textCursorDrawable sur @null devrait entraîner l'utilisation de Android:textColor comme couleur du curseur.

L'attribut "textCursorDrawable" est disponible dans les API de niveau 12 et supérieur. 

1007
Dean

Dans la mise en page 

<EditText  
    Android:layout_width="match_parent" 
    Android:layout_height="wrap_content" 
    Android:textCursorDrawable="@drawable/color_cursor"
    />

Ensuite, créez XML xable: 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. 

389
star18bit

On dirait que toutes les réponses vont autour des buissons.

Dans votre EditText, utilisez la propriété: 

Android:textCursorDrawable="@drawable/black_cursor"

et ajoutez le black_cursor.xml dessinable à 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.

55
Zach-M

Il existe un nouveau moyen de changer la couleur du curseur dans la dernière Appcompact v21
Il suffit de changer colorAccent dans un 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 API 21+ 
Update 2 : Je ne suis pas sûr de la version minimale d'Android pour que cela puisse fonctionner.
Testé par la version Android:

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

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

36
dineth

Pour tous ceux qui ont besoin de définir la couleur du curseur EditText de manière dynamique, vous trouverez ci-dessous deux méthodes pour y parvenir.


Tout d’abord, créez 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 que vous pouvez dessiner sur le curseur 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 modifier simplement la couleur du curseur pouvant être dessiné par défaut, 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) {
    }
}
24
Jared Rummler

En retard à la fête, voici ma réponse, 

Ceci est destiné aux personnes qui (pas} _ cherchent à changer la colorAccent dans leur thème parent, mais veulent changer les attributs EditText!

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

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

 enter image description here

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

Créez maintenant un dessin (edit_text_background) et ajoutez une ressource xml pour l’arrière-plan! Vous pouvez personnaliser à votre guise!

<?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 l'avez défini ce style dans votre thème d'activité.

Exemple : 

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

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Your Theme data -->
    <item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
</style>
10
Charuක
Edittext cursor color you want changes your color.
   <EditText  
    Android:layout_width="fill_parent" 
    Android:layout_height="wrap_content" 
    Android:textCursorDrawable="@drawable/color_cursor"
    />

Puis créez 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>
7
influx

Pour moi, j'ai modifié à la fois 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 les couleurs.xml

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

J'ai sorti l'attribut Android: textCursorDrawable en @null que j'ai placé dans le style editText. Quand j'ai essayé d'utiliser ceci, les couleurs ne changeraient pas. 

7

Wow, je suis vraiment en retard pour cette soirée mais elle 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 obtenir une réponse. Cette réponse fonctionne désormais avec Android 2.1 et les versions ultérieures Allez à RES/VALUES/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 de cette ligne de code dans votre dossier RES/COLOR 

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

Pourquoi poster ce retard? Il serait peut-être intéressant d’envisager certaines catégories de monstres qu’Android est devenu! 

4
Grendel

editcolor.xml  

Android:textCursorDrawable="@drawable/editcolor"

Dans le fichier xml, définir le code de couleur de edittext couleur

3
Avnish Titoriya

Ici @Jared Rummler set programmatique Version Drawable Color () 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);
    }
}
2
Oliver Jonas

si vous voulez une couleur spécifique, vous devez utiliser AppCompatEditText puis le jeu de fond null 

travaille pour moi 

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

Voir ce Gist

1
ssdeno

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.

1
Clark Will Battle

utilisez ceci

Android: textCursorDrawable = "@ color/white"

1
Mohammed Alzoubi

Une autre solution simple consisterait à accéder à res> values> colors.xml dans le dossier de votre projet et à modifier la valeur de l’accent de couleur correspondant à la couleur de votre choix.

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

Le code ci-dessus change votre curseur en noir.

0
xwaxes

cela s'appelle colorAccent dans Android.

aller à res -> valeurs -> styles.xml add

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

sinon existe.

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

change t he color of colorAccent in styles.xm, that's it simple

0
Abhishek Saini