Comment puis-je changer EditText's
couleur du curseur par programme?
Dans Android 4.0 et supérieur, la couleur du curseur est blanc. Et si l'arrière-plan EditText
s est également blanc, il devient invisible.
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
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.
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>
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).
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>
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.
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...
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>