web-dev-qa-db-fra.com

Comment définir la couleur du texte de la bibliothèque d'assistance sur une barre autre qu'Android: textColor?

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.

enter image description here

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.

84
Mahonster

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()
35
JPM

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);
147
Jarod Young

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

15
Richard

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();
13
Jet Zhao

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.

13
Mahonster

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:

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

10
ulcica

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.

9
Rohit Maurya

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

Si vous migrez votre code vers AndroidX, la propriété TextView est maintenant:

com.google.Android.material.R.id.snackbar_text
6
Matjaz Kristl

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.

2
Pavneet_Singh

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)
2
Grzegorz Matyszczak

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

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.

1
Sandro Machado

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]()
        }
    }
0
Manoj Perumarath

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));
0
Summved Jain

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()
0
Phil

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
0
Anrimian

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:

yellow snackbar with black text

0
Ifta