web-dev-qa-db-fra.com

changer la couleur du curseur edittext

Comment puis-je changer EditText'scouleur du curseur par programme?

Dans Android 4.0 et supérieur, la couleur du curseur est blanc. Et si l'arrière-plan EditTexts est également blanc, il devient invisible.

71
Adem

Dans vos propriétés EditText, il existe un attribut Android:textCursorDrawable

Maintenant, réglez-le sur @ null comme,

Android:textCursorDrawable="@null"

Alors maintenant, votre curseur EditText est identique à votre EditText TextColor.

Référence de Définir la couleur du curseur EditText

115
user370305

J'ai trouvé un moyen de résoudre ce problème. Ce n'est pas la meilleure solution, mais ça marche.

Malheureusement, je ne peux utiliser que la couleur statique pour la couleur du curseur.

Tout d’abord, je définis un curseur noir dans drawable

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

Ensuite, je définis un exemple EditText dans des mises en page.

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textCursorDrawable="@drawable/blackpipe"
         >
    </EditText>

Quand je veux créer un EditText au moment de l'exécution, j'utilise ceci:

AttributeSet editText30AttributeSet = null;
int res = getResources().getIdentifier("edit30", "layout", getPackageName());//edit30 is EditText layout
XmlPullParser parser = getResources().getXml(res);
int state=0;
do {
    try {
        state = parser.next();
    } catch (Exception e1) {
        e1.printStackTrace();
    }       
    if (state == XmlPullParser.START_TAG) {
        if (parser.getName().equals("EditText")) {
            editText30AttributeSet = Xml.asAttributeSet(parser);
            break;
        }
    }
} while(state != XmlPullParser.END_DOCUMENT);
EditText view = new EditText(getContext(),editText30AttributeSet);

Vous avez maintenant une vue EditText avec un curseur noir. Peut-être que quelqu'un pourra améliorer ma solution afin que le curseur puisse être modifié au moment de l'exécution.

28
Adem

Voici, à mon avis, une meilleure solution que celle publiée par @Adem.

Java:

try {
    // https://github.com/Android/platform_frameworks_base/blob/KitKat-release/core/Java/Android/widget/TextView.Java#L562-564
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

XML:

<?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>
15
Jared Rummler

Que dire de la styles.xml utilisant AppCompat-v7?

<item name="colorControlNormal">@color/accentColor</item>
<item name="colorControlActivated">@color/accentColor</item>
<item name="colorControlHighlight">@color/accentColor</item>

Fonctionne pour moi (cet exemple est simpliste).

7
shkschneider

améliorer la réponse de Jared Rummler

Java:

try {
    // https://github.com/Android/platform_frameworks_base/blob/KitKat-release/core/Java/Android/widget/TextView.Java#L562-564
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

créez custom_cursor.xml dans le dossier res/drawable:

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

XML:

<EditText xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textCursorDrawable="@drawable/custom_cursor"
     >
</EditText>
7
kc ochibili

Donc, voici la version finale - n'a pas besoin du XML et fonctionne comme @null mais par programme:

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

Le seul problème est qu'il peut ne plus fonctionner un jour avec une nouvelle version d'Android.

PS je l'ai testé sur 4.1.2 à 5.1.

1
Sergey Galin

Vous pouvez régler le Android:textCursorDrawable attribuer à @null qui entraînera l'utilisation de Android:textColor comme couleur du curseur.

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

Merci...

1
Aj 27

Définir via AppTheme

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="Android:spinnerStyle">@style/spinner_style</item>
    <!--Add This-->
    <item name="editTextStyle">@style/EdittextStyle</item>
    <item name="Android:dropDownListViewStyle">@style/SpinnerStyle</item>
</style>

<!--New EditText Style-->
<style name="EdittextStyle" parent="Widget.AppCompat.EditText">
    <item name="Android:background">?attr/editTextBackground</item>
    <item name="Android:textColor">?attr/editTextColor</item>
    <item name="Android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
    <!--<item name="Android:textCursorDrawable">@drawable/abc_text_cursor_material</item>-->
    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>
    <item name="colorControlHighlight">@color/colorAccent</item>

</style>
1
Rakesh Yadav