J'ai donc commencé à utiliser le nouveau snack dans la bibliothèque de support technique, mais j'ai constaté que lorsque vous définissez "Android: textColor" dans votre thème, cela s'applique à la couleur du texte du snack. Ceci est évidemment un problème si la couleur de votre texte principal est sombre.
Est-ce que quelqu'un connaît un moyen de contourner cela ou des conseils sur la façon dont je devrais colorier mon texte?
EDIT January 2017: (Post-Answer)
Bien qu'il existe des solutions personnalisées pour résoudre le problème ci-dessous, il est probablement bon de fournir le moyen correct de thématiser les barres de collations.
Tout d’abord, vous ne devriez probablement pas définir Android:textColor
dans vos thèmes (à moins que vous ne sachiez vraiment à quoi sert le thème). Ceci définit la couleur du texte de chaque vue liée à 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
, référez-vous à ce guide de qualité à partir de documents tiers: http://www.materialdoc.com/snackbar/ (suivez l'implémentation du thème programmatique de ne pas compter 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 dispositions personnalisées Snackbar
, voir le lien ci-dessus. Faites-le si cette méthode vous semble trop compliquée et si vous souhaitez disposer d'un moyen fiable de conserver votre barre de progression personnalisée dans les éventuelles mises à jour de la bibliothèque de support).
Et alternativement, voir les réponses ci-dessous pour des réponses similaires et peut-être plus rapides pour résoudre votre problème.
Je sais que cela a déjà été répondu, mais le moyen le plus simple que j’ai trouvé était directement de l’utiliser avec le Html.fromHtml
méthode et une balise font
Snackbar.make(view,
Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show()
J'ai trouvé cela à Quelles sont les nouvelles fonctionnalités de Android Design Support Library et comment utiliser son Snackbar?
Cela a fonctionné pour moi pour changer la couleur du texte dans une Snackbar.
Snackbar snack = Snackbar.make(view, R.string.message, Snackbar.LENGTH_LONG);
View view = snack.getView();
TextView tv = (TextView) view.findViewById(Android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.WHITE);
snack.show();
MISE À JOUR: ANDROIDX: Comme le souligne dblackker dans les commentaires, dans la nouvelle bibliothèque de prise en charge d'AndroidX, le code permettant de trouver l'ID de Snackbar TextView devient:
TextView tv = snack.findViewById(com.google.Android.material.R.id.snackbar_text);
Créé cette fonction d'extention de kotlin que j'utilise dans mes projets:
fun Snackbar.setTextColor(color: Int): Snackbar {
val tv = view.findViewById(Android.support.design.R.id.snackbar_text) as TextView
tv.setTextColor(color)
return this
}
tilisation conforme à vos attentes:
Snackbar.make (vue, R.string.votre_string, Snackbar.LENGTH_LONG) .setTextColor (Color.WHITE) .show ()
Piratage sur Android.support.design.R.id.snackbar_text
est fragile, une façon meilleure ou moins astucieuse de le faire sera:
String snackText = getResources().getString(YOUR_RESOURCE_ID);
SpannableStringBuilder ssb = new SpannableStringBuilder()
.append(snackText);
ssb.setSpan(
new ForegroundColorSpan(Color.WHITE),
0,
snackText.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Snackbar.make(
getView(),
ssb,
Snackbar.LENGTH_SHORT)
.show();
D'accord, j'ai donc corrigé le problème en réorganisant la façon dont je règle les couleurs du texte.
Dans mon thème de lumière, j'ai mis Android:textColorPrimary
à la normal dark text
Je voulais et j’ai mis Android:textColor
à white
.
J'ai mis à jour tous mes affichages de texte et tous mes boutons pour que Android:textColor="?android:attr/textColorPrimary".
Donc, parce que snackbar tire de textColor
, je viens de régler tout mon texte sur textColorPrimary
.
EDIT 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 du thème.
Une approche consiste à utiliser des portées:
final ForegroundColorSpan whiteSpan = new ForegroundColorSpan(ContextCompat.getColor(this, Android.R.color.white));
SpannableStringBuilder snackbarText = new SpannableStringBuilder("Hello, I'm white!");
snackbarText.setSpan(whiteSpan, 0, snackbarText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
Snackbar.make(view, snackbarText, Snackbar.LENGTH_LONG)
.show();
Avec les portées, vous pouvez également ajouter plusieurs couleurs et styles dans un même snack. Voici un joli guide:
Si vous avez migré vers androidX, utilisez com.google.Android.material.R.id.snackbar_text
au lieu de Android.support.design.R.id.snackbar_text
pour changer la couleur du texte sur le snackbar.
La seule façon dont je vois l'utilisation consiste à utiliser getView()
et à 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 vont bientôt ajouter des API à ce problème.
Snackbar snack = Snackbar.make(...);
ViewGroup group = (ViewGroup) snack.getView();
for (int i = 0; i < group.getChildCount(); i++) {
View v = group.getChildAt(i);
if (v instanceof TextView) {
TextView t = (TextView) v;
t.setTextColor(...)
}
}
snack.show();
Si vous migrez votre code vers AndroidX, la propriété TextView est maintenant:
com.google.Android.material.R.id.snackbar_text
J'ai changé de thème
Theme.AppCompat.Light.NoActionBar
à
Theme.AppCompat.NoActionBar
Cela a fonctionné. Essayez d’utiliser un thème simple au lieu de la lumière ou d’un autre thème.
Si vous décidez d'utiliser la solution sale et hacky avec la recherche de TextView dans Snackbar par ID et que vous avez déjà migré vers Android, alors voici le code:
val textViewId = com.google.Android.material.R.id.snackbar_text
val snackbar = Snackbar.make(view, "Text", Snackbar.LENGTH_SHORT)
val textView = snackbar.view.findViewById(textViewId) as TextView
textView.setTextColor(Color.WHITE)
C'est ce que j'utilise quand j'ai besoin de couleurs personnalisées
@NonNull
public static Snackbar makeSnackbar(@NonNull View layout, @NonNull CharSequence text, int duration, int backgroundColor, int textColor/*, int actionTextColor*/){
Snackbar snackBarView = Snackbar.make(layout, text, duration);
snackBarView.getView().setBackgroundColor(backgroundColor);
//snackBarView.setActionTextColor(actionTextColor);
TextView tv = (TextView) snackBarView.getView().findViewById(Android.support.design.R.id.snackbar_text);
tv.setTextColor(textColor);
return snackBarView;
}
Et consommé comme:
CustomView.makeSnackbar(view, "Hello", Snackbar.LENGTH_LONG, Color.YELLOW,Color.CYAN).setAction("DO IT", myAction).show();
Vous pouvez utiliser cette bibliothèque: https://github.com/SandroMachado/restaurant
new Restaurant(MainActivity.this, "Snackbar with custom text color", Snackbar.LENGTH_LONG)
.setTextColor(Color.GREEN)
.show();
Disclaimer: J'ai fait la bibliothèque.
Selon les nouveaux composants AndroidX Jitpack
implementation 'com.google.Android.material:material:1.0.0'
Utilisez cette extension que j'avais créée
inline fun View.snack(message: String, length: Int = Snackbar.LENGTH_LONG,
f: Snackbar.() -> Unit) {
val snack = Snackbar.make(this, message, length)
snack.f()
snack.show()
}
fun Snackbar.action(action: String, actionColor: Int? = null, textColor: Int? = null, listener: (View) -> Unit) {
setAction(action, listener)
actionColor?.let {
setActionTextColor(it)
}
textColor?.let {
this.view.findViewById<TextView>(R.id.snackbar_text).setTextColor(it)
}
}
Utilisez-le comme ça
btn_login.snack(
getString(R.string.fields_empty_login),
ContextCompat.getColor(this@LoginActivity, R.color.whiteColor)
) {
action(getString(R.string.text_ok), ContextCompat.getColor(this@LoginActivity, R.color.gray_300),ContextCompat.getColor(this@LoginActivity, R.color.yellow_400)) {
[email protected]()
}
}
J'ai un code simple qui aidera à obtenir une instance à la fois du textview de Snackbar, après quoi vous pourrez appeler toutes les méthodes applicables dans un textview.
Snackbar snackbar = Snackbar.make( ... ) // Create Snack bar
snackbar.setActionTextColor(getResources().getColor(R.color.white)); //if you directly want to apply the color to Action Text
TextView snackbarActionTextView = (TextView) snackbar.getView().findViewById( Android.support.design.R.id.snackbar_action );
snackbarActionTextView.setTextColor(Color.RED); //This is another way of doing it
snackbarActionTextView.setTypeface(snackbarActionTextView.getTypeface(), Typeface.BOLD);
//Below Code is to modify the Text in Snack bar
TextView snackbarTextView = (TextView) snackbar.getView().findViewById(Android.support.design.R.id.snackbar_text);
snackbarTextView.setTextSize( 16 );
snackbarTextView.setTextColor(getResources().getColor(R.color.white));
Si vous êtes dans Kotlin, vous pouvez créer une extension:
fun Snackbar.withTextColor(color: Int): Snackbar {
val tv = this.view.findViewById(Android.support.design.R.id.snackbar_text) as TextView
tv.setTextColor(color)
return this
}
sage:
yourSnackBar.withTextColor(Color.WHITE).show()
Trouver par identifiant n'a pas fonctionné pour moi alors j'ai trouvé une autre solution:
Snackbar snackbar = Snackbar.make(view, text, duration);//just ordinary creation
ViewGroup snackbarView = (ViewGroup) snackbar.getView();
SnackbarContentLayout contentLayout = (SnackbarContentLayout) snackbarView.getChildAt(0);
TextView tvText = contentLayout.getMessageView();
tvText.setTextColor(/*your color here*/);
//set another colors, show, etc
Juste pour économiser votre temps de développement précieux, voici la méthode statique que j'utilise:
public static void snack(View view, String message) {
if (!TextUtils.isEmpty(message)) {
Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_SHORT);
snackbar.getView().setBackgroundColor(Color.YELLOW);
TextView tv = snackbar.getView().findViewById(Android.support.design.R.id.snackbar_text); //snackbar_text
tv.setTextColor(Color.BLACK);
snackbar.show();
}
}
Voici à quoi ça ressemble: