web-dev-qa-db-fra.com

Existe-t-il un moyen d'ajouter une icône à une Snackbar?

Voici mon code Snackbar:

        Snackbar.make(viewHolder.productView, "Some Text Here ..", Snackbar.LENGTH_SHORT)
                .setAction("I want be a icon here instead TEXT", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // Perform anything for the action selected
                    }
                })
                .show();

Est-il possible d'ajouter une icône au lieu du texte dans .setAction?

Je sais Google a suggéré de ne pas utiliser l'icône dans Snackbar , mais je veux l'utiliser.

26
Farhad ArcxX

ImageSpan peut ne pas sembler correct avec un texte plus long (plusieurs lignes). Utilisez plutôt un composé gauche dessinable (identique à Android:drawableLeft).

Snackbar snackbar = Snackbar.make(layout, R.string.test, Snackbar.LENGTH_LONG);
View snackbarLayout = snackbar.getView();
TextView textView = (TextView)snackbarLayout.findViewById(Android.support.design.R.id.snackbar_text);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.white_checkbox, 0, 0, 0);
textView.setCompoundDrawablePadding(getResources().getDimensionPixelOffset(R.dimen.snackbar_icon_padding));
snackbar.show();

Si vous utilisez la bibliothèque de matériaux AndroidX, remplacez Android.support.design.R.id.snackbar_text avec com.google.Android.material.R.id.snackbar_text.

44
Daniel Zolnai

Avez-vous entendu parler d'ImageSpan? Cela peut vous aider à atteindre votre objectif! Voir ci-dessous le code:

SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("My message ").append(" ");
builder.setSpan(new ImageSpan(MainActivity.this, R.drawable.ic_launcher), builder.length() - 1, builder.length(), 0);
builder.append(" next message");
Snackbar.make(parent view, builder, Snackbar.LENGTH_LONG).show();]

N'utilisez pas de grandes icônes car elles ne maintiendront pas la gravité.

Ref: Comment afficher l'image dans TextView d'Android?

J'espère que cela a aidé.

17
Harry

Voici tout ce que vous pouvez changer d'un Snackbar:

Snackbar snackbar = Snackbar
  .make(parentLayout, R.string.snackbar_text, Snackbar.LENGTH_LONG)
  .setAction(R.string.snackbar_action, myOnClickListener);
snackbar.setActionTextColor(Color.CYAN);
View snackbarView = snackbar.getView();
snackbarView.setBackgroundColor(Color.YELLOW);//change Snackbar's background color;
TextView textView = (TextView)snackbarView .findViewById(Android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.BLUE);//change Snackbar's text color;
snackbar.show(); // Don’t forget to show!

Malheureusement, nous ne pouvons toujours pas personnaliser le contenu d'un Snackbar de la même manière que nous le faisons pour Toast. A l'avenir? Je ne sais pas.

3
SilentKnight

Supposons que vous souhaitiez ajouter une icône à gauche d'un snack-bar. Le code suivant vous aide à y parvenir:

SpannableStringBuilder builderTextLeft = new SpannableStringBuilder();
builderTextLeft.append(" ");
builderTextLeft.setSpan(new ImageSpan(context, R.drawable.ic_vector), 0, 1, 0);
Snackbar snackbar = Snackbar.make(parentLayout, builderTextLeft, Snackbar.LENGTH_LONG);
snackbar.show();

Dans le code ci-dessus, j'ai ajouté une icône d'information à gauche du snack-bar.

Si vous souhaitez ajouter une icône à droite d'un snack-bar, vous devez procéder comme suit:

SpannableStringBuilder buildetTextRight = new SpannableStringBuilder();
buildetTextRight.append(" ");
buildetTextRight.setSpan(new ImageSpan(context, R.drawable.ic_close),
                buildetTextRight.length()-1, buildetTextRight.length(), 0);

Dans le code ci-dessus, j'ai ajouté une icône de fermeture à droite du snack-bar.

0
Avik Chowdhury

Vous pouvez également ajouter des vues à SnackbarContentLayout

Code Kotlin:

val snackbar = Snackbar.make(....
val textView = snackbar.view.findViewById(R.id.snackbar_action) as TextView
textView.isAllCaps = false
val imgClose = ImageView(context)
imgClose.scaleType = ImageView.ScaleType.CENTER_INSIDE
val layImageParams = ViewGroup.LayoutParams(WRAP_CONTENT, MATCH_PARENT)
imgClose.setImageResource(R.drawable.ic_close)
(textView.parent as SnackbarContentLayout).addView(imgClose, layImageParams)
imgClose.setOnClickListener { snackbar.dismiss() }
snackbar.show()
0
anthorlop