J'ai donc commencé à utiliser le nouveau Snackbar dans la bibliothèque de support de conception, mais j'ai trouvé que lorsque vous définissez "android: textColor" dans votre thème, cela s'applique à la couleur du texte du snackbar. C'est évidemment un problème si la couleur de votre texte principale est sombre.
Quelqu'un connaît-il un moyen de contourner ce problème ou a-t-il des conseils sur la façon dont je dois colorer mon texte?
EDIT Janvier 2017: (Post-réponse)
Bien qu'il existe des solutions personnalisées pour résoudre le problème ci-dessous, il est probablement bon de fournir le bon moyen de thème Snackbars.
Premièrement, vous ne devriez probablement pas du tout définir android:textColor
vos thèmes (à moins que vous ne connaissiez vraiment la portée de ce qui utilise le thème). Cela définit la couleur du texte de pratiquement toutes les vues qui se connectent à votre thème. Si vous souhaitez définir des couleurs de texte dans vos vues qui ne sont pas par défaut, utilisez android:primaryTextColor
et référencez cet attribut dans vos vues personnalisées.
Cependant, pour appliquer des thèmes à Snackbar
, veuillez vous reporter à ce guide de qualité à partir d'un document tiers: http://www.materialdoc.com/snackbar/ (Suivez l'implémentation du thème programmatique pour qu'il ne repose pas sur un style xml)
Pour référence:
// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);
// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));
// get snackbar view
View snackbarView = snackbar.getView();
// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);
textView.setTextColor(getResources().getColor(R.color.indigo));
// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);
(Vous pouvez également créer vos propres Snackbar
mises en page personnalisées , voir le lien ci-dessus. Faites-le si cette méthode vous semble trop piratée et que vous voulez un moyen sûrement fiable de faire durer votre Snackbar personnalisé à travers d'éventuelles mises à jour de la bibliothèque de support).
Et sinon, voir les réponses ci-dessous pour des réponses similaires et peut-être plus rapides pour résoudre votre problème.
la source
android:textColorPrimary
Réponses:
Je sais que cela a déjà été répondu, mais le moyen le plus simple que j'ai trouvé était directement dans la marque en utilisant la
Html.fromHtml
méthode et unefont
balisela source
J'ai trouvé ceci sur Quelles sont les nouvelles fonctionnalités de la bibliothèque de support de conception Android et comment utiliser sa barre de collation?
Cela a fonctionné pour moi pour changer la couleur du texte dans un snack-bar.
MISE À JOUR: ANDROIDX: Comme le souligne dblackker dans les commentaires, avec la nouvelle bibliothèque de support AndroidX, le code pour trouver l'ID de Snackbar TextView change en:
la source
snackbar_action
au lieu desnackbar_text
. Voir cette réponse pour un exemple: stackoverflow.com/a/36800101/293280snack.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
Le piratage
android.support.design.R.id.snackbar_text
est fragile, une manière meilleure ou moins pirate de le faire sera:la source
J'ai créé cette fonction d'extension de kotlin que j'utilise dans mes projets:
Utilisation comme vous vous attendez:
la source
com.google.android.material.R.id.snackbar_text
si vous migrez vers AndroidX.D'accord, j'ai donc résolu le problème en réorganisant essentiellement la façon dont je fais les couleurs du texte.
Dans mon thème clair, je me suis mis
android:textColorPrimary
aunormal dark text
je voulais, et je me suis misandroid:textColor
àwhite
.J'ai mis à jour toutes mes vues de texte et mes boutons pour avoir
android:textColor="?android:attr/textColorPrimary".
Donc, parce que le snack s'inspire de
textColor
, je viens de définir tous mes autres textes surtextColorPrimary
.MODIFIER JANVIER 2017: ---------------------------------------------- ------
Donc, comme le disent les commentaires, et comme indiqué dans la question originale modifiée ci-dessus, vous ne devriez probablement pas définir
android:textColor
dans vos thèmes, car cela change la couleur du texte de chaque vue à l'intérieur du thème.la source
android:textColor
votre thème. C'est un attribut de style deTextView
. Si vous le définissez dans votre thème, vous remplacez la couleur du texte de toutTextView
ouButton
qui ne spécifie pas sa couleur de texte en XML. Cela se trouve également être le message du snack-bar qui prend normalement la couleur de sa superposition de thème sombre .Une approche consiste à utiliser des travées:
Avec les travées, vous pouvez également ajouter plusieurs couleurs et styles dans un seul Snackbar. Voici un bon guide:
https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/
la source
Si vous avez migré vers androidX, utilisez
com.google.android.material.R.id.snackbar_text
plutôt queandroid.support.design.R.id.snackbar_text
pour changer la couleur du texte sur le snackbar.la source
La seule façon que je vois est d'utiliser
getView()
et de parcourir son enfant. Je ne sais pas si ça va marcher, et c'est mauvais comme ça en a l'air. J'espère qu'ils ajouteront bientôt une API sur ce problème.la source
Si vous allez migrer votre code vers AndroidX, la propriété TextView est maintenant:
la source
C'est ce que j'utilise lorsque j'ai besoin de couleurs personnalisées
Et consommé comme:
la source
J'ai changé de thème
à
Cela a fonctionné Essayez d'utiliser un thème simple au lieu d'un thème léger ou autre.
la source
Si vous décidez d'utiliser la solution sale et hacky avec la recherche de TextView dans Snackbar par identifiant et que vous avez déjà migré vers androidx, voici le code:
la source
Vous pouvez utiliser cette bibliothèque: https://github.com/SandroMachado/restaurant
Avertissement: j'ai fait la bibliothèque.
la source
Find by id n'a pas fonctionné pour moi, j'ai donc trouvé une autre solution:
la source
Utilisez le
Snackbar
inclus dans la bibliothèque de composants de matériaux et appliquez lesetTextColor
pour définir la couleur du textesetActionTextColor
pour définir la couleur du texte utilisée par l'action. Vous pouvez utiliser une couleur ou un sélecteur de couleursetBackgroundTint
pour définir la couleur de fond du SnackbarQuelque chose comme:
la source
J'ai un code simple qui aidera à obtenir une instance à la fois de la vue de texte de Snackbar, après cela, vous pouvez appeler toutes les méthodes applicables à une vue de texte.
la source
Juste pour économiser votre précieux temps de développement, voici la méthode statique que j'utilise:
Voici à quoi ça ressemble:
la source
Si vous êtes à Kotlin , vous pouvez créer une extension:
Utilisation :
la source
Selon les nouveaux composants AndroidX Jitpack
Utilisez cette extension que j'avais créée
Utilisez-le comme ça
la source
C'est ma solution de contournement pour résoudre ce type de problème lors de l'
androidx
utilisationkotlin
Vous devez initialiser à l'
mContent
intérieur de laonViewCreated
méthode comme ci-dessousla source
Actuellement (janvier 2020) avec
com.google.android.material:material:1.2.0
et probablement aussi1.1.0
Est certainement la meilleure façon de le faire en remplaçant ces styles:
Si vous utilisez un thème matériel avec
.Bridge
à la fin, pour une raison quelconque, aucun de ces styles n'est défini. Snackar utilisera donc une mise en page héritée sans ces styles.J'ai trouvé dans le code source que les deux
snackbarButtonStyle
etsnackbarTextViewStyle
doivent être définis sinon il ne sera pas utilisé.la source
J'ai également remarqué le même problème. Grâce aux réponses ici, j'ai créé une petite classe, qui peut aider à résoudre ce problème plus facilement, simplement en remplaçant ceci:
avec ça:
Voici ma classe:
}
la source