J'utilise appcompat v7 pour obtenir une apparence cohérente sur Android 5 et moins. Cela fonctionne plutôt bien. Cependant, je ne peux pas comprendre comment changer la couleur de la ligne de fond et la couleur d'accent pour EditTexts. C'est possible?
J'ai essayé de définir une coutume android:editTextStyle
(cf. ci-dessous) mais j'ai seulement réussi à changer la couleur d'arrière-plan complète ou la couleur du texte mais pas la ligne du bas ni la couleur d'accent. Y a-t-il une valeur de propriété spécifique à utiliser? dois-je utiliser une image dessinable personnalisée via la android:background
propriété? n'est-il pas possible de spécifier une couleur en hexa?
<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextStyle">@style/Widget.App.EditText</item>
</style>
<style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
???
</style>
Selon les sources d'API Android 21, EditTexts avec la conception matérielle semble utiliser colorControlActivated
et colorControlNormal
. Par conséquent, j'ai essayé de remplacer ces propriétés dans la définition de style précédente, mais cela n'a aucun effet. Appcompat ne l'utilise probablement pas. Malheureusement, je ne trouve pas les sources de la dernière version de l'application compatible avec la conception matérielle.
AppCompatEditText
, apparemment.Réponses:
Enfin, j'ai trouvé une solution. Il consiste simplement de passer outre la valeur
colorControlActivated
,colorControlHighlight
etcolorControlNormal
dans la définition de votre thème de l' application et non votre style edittext. Ensuite, pensez à utiliser ce thème pour toute activité que vous désirez. Voici un exemple:la source
android:theme="@style/Theme.App.Base
. Cela garantira que le style n'affectera pas également les autres vues de vos mises en page que vous ne souhaitez pas modifier.AppCompatActivity
. Cela ne fonctionnera pas s'il hérite deActivity
.Je sentais que cela avait besoin d'une réponse au cas où quelqu'un voudrait changer un seul edittext. Je le fais comme ça:
la source
Bien que la solution de Laurents soit correcte, elle présente certains inconvénients, comme décrit dans les commentaires, car non seulement la ligne du bas du
EditText
est teintée, mais le bouton Retour duToolbar
,CheckBoxes
etc. également.Heureusement,
v22.1
deappcompat-v7
nouvelles possibilités ont été introduites. Il est désormais possible d'assigner un thème spécifique à une seule vue. Directement depuis le Changelog :Ainsi, au lieu de définir la couleur souhaitée dans un thème global, nous en créons une nouvelle et l’affectons uniquement au
EditText
.Exemple:
la source
colorControlNormal
sans le préfixe android utilise la méthode appcompat pour teinter les widgets tandis qu'avec le préfixe, il revient à la méthode système et cela n'est disponible que dans les appareils API 21+.22.2.0
version d'AppCompat mais cette astuce ne fonctionne pas :(Cela peut être modifié en XML en utilisant:
Pour l'API de référence> = 21, utilisez la compatibilité:
Pour une compatibilité API <21 vers l'arrière, utilisez:
la source
backgroundTint="@color/blue"
au lieu deandroid:backgroundTint="@color/blue"
pour un support rétrocompatibleandroid:backgroundTint="@color/blue"
, utilisezapp:backgroundTint="@color/blue"
pour prendre en charge les appareils pré-Lollipop, merci pour votre commentaire!tools:ignore="MissingPrefix"
si un soulignement rouge apparaît sousapp:backgroundTint="<your color>"
Voici la solution pour les API <21 et supérieures
J'espère que ça aide
la source
24.2.1
,25.1.1
,25.2.0
pour le dispositif <21 et> 21 et il travaille toujours. Veuillez vérifier cette démo simple drive.google.com/file/d/0B_poNaia6t8kSzU3bDFVazRSSDA/… . Je ne sais pas pourquoi ce code ne fonctionne pas pour vous, alors faites-le moi savoir. merciLa réponse acceptée est un peu plus par élément de style, mais la chose la plus efficace à faire est d'ajouter l' attribut colorAccent dans votre style AppTheme comme ceci:
L'attribut colorAccent est utilisé pour la teinture des widgets dans toute l'application et doit donc être utilisé pour la cohérence
la source
name="android:colorAccent"
erreurSi vous utilisez,
appcompat-v7:22.1.0+
vous pouvez utiliser le DrawableCompat pour teinter vos widgetsla source
Utilisation:
Cela prendra en charge les appareils pré-Lollipop non seulement +21
la source
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
et cela devrait fonctionnerla source
Une solution rapide à votre problème consiste à rechercher dans votreapplication / build / intermediates / exploded-aar / com.android.support / appcompat-v7 / res / drawable / for abc_edit_text_material.xml et à copier ce fichier xml dans votre dossier drawable. Ensuite, vous pouvez changer la couleur des 9 fichiers de patch depuis l'intérieur de ce sélecteur, afin de correspondre à vos préférences.
la source
Il est très facile d'ajouter simplement un
android:backgroundTint
attribut dans votre fichierEditText
.la source
app:backgroundTint="@color/blue"
fonctionne à tous les niveaux de l'api .. bien que pour une raison quelconque, ilVoici une partie du code source de la
TextInputLayout
bibliothèque de conception de support ( MISE À JOUR pour la version 23.2.0 ), qui changeEditText
la couleur de la ligne de fond d'une manière plus simple:Il semble que tout le code ci-dessus devienne inutile en 23.2.0 si vous voulez changer la couleur par programme.
Et si vous souhaitez prendre en charge toutes les plateformes, voici ma méthode:
la source
Moi aussi, je suis resté coincé sur ce problème trop longtemps.
J'avais besoin d'une solution qui fonctionnait pour les versions supérieures et inférieures à la v21.
J'ai finalement découvert une solution très simple, peut-être pas idéale mais efficace: il suffit de définir la couleur d'arrière-plan
transparent
dans les propriétés EditText.J'espère que cela fait gagner du temps à quelqu'un.
la source
Pour moi, j'ai modifié à la fois l'AppTheme et une valeur colours.xml Le colorControlNormal et le colorAccent m'ont aidé à changer la couleur de la bordure EditText. Ainsi que le curseur et le "|" à l'intérieur d'un EditText.
Voici le colours.xml
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.
la source
Vous pouvez définir l'arrière-plan de edittext sur un rectangle avec un remplissage moins à gauche, à droite et en haut pour y parvenir. Voici l'exemple xml:
Remplacez la forme par un sélecteur si vous souhaitez fournir une largeur et une couleur différentes pour l'edittext focalisé.
la source
Dans Activit.XML, ajoutez le code
Où
BackgroundTint=color
pour votre couleur désiréela source
J'utilise cette méthode pour changer la couleur de la ligne avec PorterDuff, sans autre dessinable.
la source
Si vous souhaitez modifier la ligne de fond sans utiliser les couleurs de l'application, utilisez ces lignes dans votre thème:
Je ne connais pas d'autre solution.
la source
J'ai trouvé une solution de travail à ce problème après 2 jours de lutte, la solution ci-dessous est parfaite pour ceux qui veulent changer quelques textes d'édition uniquement, changer / basculer la couleur via le code java et veulent surmonter les problèmes de comportement différent sur les versions du système d'exploitation en raison de l'utilisation de la méthode setColorFilter ().
Utilise en xml
Ajoutez des lignes avec style
code java pour changer de couleur
la source
J'ai été absolument déconcerté par ce problème. J'avais tout essayé dans ce fil et dans d'autres, mais peu importe ce que je faisais, je ne pouvais pas changer la couleur du soulignement en autre chose que le bleu par défaut.
J'ai finalement compris ce qui se passait. J'utilisais (à tort)
android.widget.EditText
lors de la création d'une nouvelle instance (mais le reste de mes composants provenait de la bibliothèque appcompat). J'aurais dû utiliserandroid.support.v7.widget.AppCompatEditText
. J'ai remplacénew EditText(this)
parnew AppCompatEditText(this)
et le problème a été résolu instantanément. Il s'avère que si vous utilisez réellementAppCompatEditText
, il respectera simplement leaccentColor
thème de votre thème (comme mentionné dans plusieurs commentaires ci-dessus) et aucune configuration supplémentaire n'est nécessaire.la source
C'est le plus simple et le plus efficace / réutilisable / fonctionne sur toutes les API
Créez une classe EditText personnalisée comme ceci:
Ensuite, utilisez-le comme ceci:
la source
Pour modifier dynamiquement l'arrière-plan EditText, vous pouvez utiliser ColorStateList .
Crédits: Cette réponse SO à propos de ColorStateList est géniale .
la source
Ajouter
app:backgroundTint
pour un niveau d'api inférieur à 21. Sinon, utilisezandroid:backgroundTint
.Pour un niveau d'api inférieur à 21.
Pour un niveau supérieur au niveau 21 de l'API.
la source
Veuillez modifier cette méthode en fonction de vos besoins. Cela a fonctionné pour moi!
la source