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.
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.
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()
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();
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.
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();
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 ()
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:
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();
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();
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.
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.
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));
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:
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()
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();
}
}
}