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

donc j'ai commencé à utiliser le nouveau Snackbar dans la bibliothèque de soutien de conception, mais j'ai trouvé que lorsque vous définissez" android:textColor " dans votre thème, il s'applique à la couleur de texte de la barre de commande. C'est évidemment un problème si votre principale couleur de texte est sombre.

enter image description here

est-ce que quelqu'un sait comment contourner cela ou a des conseils pour que je colore mon texte?

EDIT janvier 2017: (Après Réponse)

bien qu'il y ait quelques solutions personnalisées pour résoudre le problème ci-dessous, il est probablement bon de fournir la bonne façon de 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 portée de ce qui utilise le thème). Ceci définit la couleur du texte de chaque vue qui se connecte à votre thème. Si vous voulez 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 , s'il vous plaît référence ce guide de qualité d'un tiers matériel doc: http://www.materialdoc.com/snackbar / (suivre le thème de la mise en œuvre du programme 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 votre propre Snackbar mises en page, voir le lien ci-dessus. Faites - le si cette méthode semble trop hacky et vous voulez un moyen sûrement fiable pour avoir votre Snackbar personnalisé dernier par des mises à jour possibles de bibliothèque de soutien).

et alternativement, voir les réponses ci-dessous pour des réponses similaires et peut-être plus rapides pour résoudre votre problème.

72
demandé sur Mahonster 2015-06-26 00:55:50

14 réponses

je sais que cela a déjà été répondu, mais la façon la plus facile que j'ai trouvé était directement dans la marque en utilisant la méthode Html.fromHtml et une font étiquette

Snackbar.make(view, 
       Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show()
30
répondu JPM 2018-08-03 20:31:24

j'ai trouvé ceci à quelles sont les nouvelles fonctionnalités de la bibliothèque de soutien de conception Android et comment utiliser son Snackbar?

cela a fonctionné pour moi pour changer la couleur du texte dans un 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();
131
répondu Jarod Young 2017-05-23 12:02:47

très bien donc je l'ai corrigé en réorganisant fondamentalement la façon dont je fais les couleurs de texte.

dans mon thème léger, j'ai mis android:textColorPrimary sur le normal dark text que je voulais, et j'ai mis android:textColor sur white .

j'ai mis à jour toutes mes vues texte et les boutons pour avoir android:textColor="?android:attr/textColorPrimary".

donc parce que snackbar tire de textColor , je viens de mettre tout mon autre texte à textColorPrimary .

EDIT JANVIER 2017: ----------------------------------------------------

ainsi que 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.

13
répondu Mahonster 2017-01-19 21:00:49

sur le Piratage android.support.design.R.id.snackbar_text est fragile, plus ou moins hacky façon 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();
10
répondu Jet Zhao 2016-05-13 17:32:10

a créé cette fonction d'extension 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
}

Usage normal:

snack-bar.faire(vue, R. string.your_string,snack-bar.LENGTH_LONG).setTextColor (Color.BLANC.)show ()

10
répondu Richard 2018-01-08 08:08:19

L'une des approches 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 des portées, vous pouvez également ajouter plusieurs couleurs et styles à l'intérieur d'un Snackbar. Voici un bon guide:

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

7
répondu ulcica 2015-10-22 11:13:18

la seule façon que je vois est d'utiliser getView() et le vélo à travers son enfant. Je ne sais pas si ça va marcher, et c'est aussi mauvais que ça en a l'air. J'espère qu'ils ajouteront bientôt 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();
5
répondu natario 2015-06-25 22:48:03

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
répondu makata 2016-01-10 01:23:50

j'ai changé de thème

Theme.AppCompat.Light.NoActionBar

à

Theme.AppCompat.NoActionBar 

ça a marché.Essayez d'utiliser le thème simple au lieu de la lumière ou d'un autre thème.

2
répondu Pavneet_Singh 2017-12-17 10:02:32

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

Avertissement: j'ai fait la bibliothèque.

1
répondu Sandro Machado 2015-11-28 01:04:44

j'ai un code simple qui aidera à obtenir une instance à la fois du textview de Snackbar, après que vous pouvez appeler toutes les méthodes qui sont applicables sur 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
répondu Summved Jain 2017-12-17 10:02:53

juste pour sauver votre précieux temps de développement, 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
répondu Ifta 2018-06-26 16:31:11

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
}

Utilisation :

yourSnackBar.withTextColor(Color.WHITE).show()
0
répondu Phil 2018-07-18 14:59:20

j'ai aussi 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, juste en remplaçant ceci:

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

avec ceci:

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, String 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();
    }
}

}

-1
répondu Dr. Failov 2016-03-26 10:52:05