Comment définir la couleur du texte de la bibliothèque de soutien de snackbar à autre chose qu’android: textColor?

J’ai donc commencé à utiliser la nouvelle Snackbar dans la bibliothèque Support de conception, 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 votre couleur de texte primaire est sombre.

entrer la description de l'image ici

Est-ce que quelqu’un sait comment contourner cela ou avoir des conseils sur la façon dont je devrais colorer mon texte?

EDIT janvier 2017: (après réponse)

Bien qu’il existe quelques solutions personnalisées pour résoudre le problème ci-dessous, il est probablement bon de fournir la bonne façon de choisir le thème Snackbars.

Tout d’abord, vous ne devriez probablement pas définir android:textColor dans vos thèmes (à moins que vous ne connaissiez vraiment la scope de l’utilisation du 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 atsortingbut dans vos vues personnalisées.

Toutefois, pour appliquer des thèmes à Snackbar , veuillez vous Snackbar à ce guide de qualité à partir d’un document matériel 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 dispositions Snackbar personnalisées, voir le lien ci-dessus. Faites-le si cette méthode est trop piratée et si vous voulez un moyen fiable de faire durer votre Snackbar via les éventuelles mises à jour des bibliothèques 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 la façon la plus simple que j’ai trouvée était directement dans la marque en utilisant la méthode Html.fromHtml et une balise de font

 Snackbar.make(view, Html.fromHtml("Tap to open").show() 

Je l’ai trouvé à Quelles sont les nouvelles fonctionnalités de la bibliothèque de support de conception Android et comment utiliser sa Snackbar?

Cela a fonctionné pour moi pour changer la couleur du texte dans une Snackbar.

 Snackbar snack = Snackbar.make(view, R.ssortingng.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(); 

Bon alors je l’ai corrigé en réorganisant essentiellement la façon dont je fais les couleurs du texte.

Dans mon thème léger, je définis android:textColorPrimary sur le normal dark text je souhaitais, et je définis android:textColor sur white .

J’ai mis à jour toutes mes vues de texte et mes boutons pour avoir android:textColor="?android:attr/textColorPrimary".

Donc, comme le snackbar tire de textColor , je mets simplement tout mon autre texte dans textColorPrimary .

EDITER JANVIER 2017: ———————————————- ——

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 modifie la couleur du texte de chaque vue du thème.

J’ai créé cette fonction d’extension 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 } 

Utilisation comme on peut s’y attendre:

Snackbar.make (view, R.ssortingng.your_ssortingng, Snackbar.LENGTH_LONG) .setTextColor (Color.WHITE) .show ()

Le piratage sur android.support.design.R.id.snackbar_text est fragile, un moyen plus efficace de le faire est:

 Ssortingng snackText = getResources().getSsortingng(YOUR_RESOURCE_ID); SpannableSsortingngBuilder ssb = new SpannableSsortingngBuilder() .append(snackText); ssb.setSpan( new ForegroundColorSpan(Color.WHITE), 0, snackText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); Snackbar.make( getView(), ssb, Snackbar.LENGTH_SHORT) .show(); 

Une approche consiste à utiliser des scopes:

 final ForegroundColorSpan whiteSpan = new ForegroundColorSpan(ContextCompat.getColor(this, android.R.color.white)); SpannableSsortingngBuilder snackbarText = new SpannableSsortingngBuilder("Hello, I'm white!"); snackbarText.setSpan(whiteSpan, 0, snackbarText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); Snackbar.make(view, snackbarText, Snackbar.LENGTH_LONG) .show(); 

Avec Spans, vous pouvez également append plusieurs couleurs et styles à l’intérieur d’une Snackbar. Voici un bon guide:

https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/

La seule façon que je vois consiste à utiliser getView() et à parcourir son enfant. Je ne sais pas si ça va marcher, et c’est mal comme ça en a l’air. J’espère qu’ils vont bientôt append une API à ce sujet.

 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(); 

C’est ce que j’utilise lorsque 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(); 

J’ai changé mon thème

 Theme.AppCompat.Light.NoActionBar 

à

 Theme.AppCompat.NoActionBar 

Cela a fonctionné. Essayez d’utiliser un thème simple au lieu de thème léger ou autre.

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.

J’ai un code simple qui aidera à obtenir une instance des deux textview de Snackbar, après cela, vous pouvez appeler toutes les méthodes applicables sur une 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)); 

Juste pour sauver votre précieux temps de développement, voici la méthode statique que j’utilise:

 public static void snack(View view, Ssortingng 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:

snack jaune avec du texte noir

Si vous êtes à 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 } 

Utilisation :

 yourSnackBar.withTextColor(Color.WHITE).show() 

J’ai aussi remarqué le même problème. Grâce aux réponses apscopes ici, j’ai créé une petite classe, ce qui peut aider à résoudre ce problème plus facilement, simplement en remplaçant ceci:

 Snackbar.make(view, "Error", Snackbar.LENGTH_LONG).show(); 

avec ça:

 Snackbar2.make(view, "Error", Snackbar.LENGTH_LONG).show(); 

Voici ma classe:

 public class Snackbar2 { static public Snackbar make(View view, int resid, int duration){ Snackbar result = Snackbar.make(view, resid, duration); process(result); return result; } static public Snackbar make(View view, Ssortingng text, int duration){ Snackbar result = Snackbar.make(view, text, duration); process(result); return result; } static private void process(Snackbar snackbar){ try { View view1= snackbar.getView(); TextView tv = (TextView) view1.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); }catch (Exception ex) { //inform about error ex.printStackTrace(); } } 

}