comment personnaliser la mise en page de snackBar?

Existe-t-il une méthode permettant de modifier la disposition d’un snackBar en vue personnalisée?

Maintenant, il est noir et nous pouvons changer la couleur de fond. Mais je ne connais pas la bonne façon de gonfler une nouvelle mise en page et de la transformer en fond de snackBars?

Merci…

La Snackbar ne vous permet pas de définir une disposition personnalisée. Cependant, comme Primoz990 vous a suggéré d’obtenir la vue Snackbar. La fonction getView renvoie le Snackbar.SnackbarLayout, qui est un object LinearLayout horizontal dont les enfants sont un TextView et un Button. Pour append votre propre vue à la Snackbar, il vous suffit de masquer TextView et d’append votre vue à la Snackbar.SnackbarLayout.

// Create the Snackbar Snackbar snackbar = Snackbar.make(containerLayout, "", Snackbar.LENGTH_LONG); // Get the Snackbar's layout view Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView(); // Hide the text TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text); textView.setVisibility(View.INVISIBLE); // Inflate our custom view View snackView = mInflater.inflate(R.layout.my_snackbar, null); // Configure the view ImageView imageView = (ImageView) snackView.findViewById(R.id.image); imageView.setImageBitmap(image); TextView textViewTop = (TextView) snackView.findViewById(R.id.text); textViewTop.setText(text); textViewTop.setTextColor(Color.WHITE); //If the view is not covering the whole snackbar layout, add this line layout.setPadding(0,0,0,0); // Add the view to the Snackbar's layout layout.addView(snackView, 0); // Show the Snackbar snackbar.show(); 

C’est possible à partir de la révision 25.1.0 de la bibliothèque de support Android

I. Déclarez la mise en page personnalisée dans votre dossier de valeurs / présentation.

      

Astuces:

  • Utilisez les valeurs @dimen/design_snackbar pour correspondre aux directives de conception de matériaux.
  • Utilisez ?attr/colorAccent pour appliquer vos modifications de thème d’application à Snackbar.

II. Étendez la classe BaseTransientBottomBar .

 public class final CustomSnackbar extends BaseTransientBottomBar { /** * Constructor for the transient bottom bar. * * @param parent The parent for this transient bottom bar. * @param content The content view for this transient bottom bar. * @param contentViewCallback The content view callback for this transient bottom bar. */ private CustomSnackbar(ViewGroup parent, View content, ContentViewCallback contentViewCallback) { super(parent, content, contentViewCallback); } } 

III. Ajouter BaseTransientBottomBar.ContentViewCallback

 public class final CustomSnackbar ...{ ... private static class ContentViewCallback implements BaseTransientBottomBar.ContentViewCallback { // view inflated from custom layout private View content; public ContentViewCallback(View content) { this.content = content; } @Override public void animateContentIn(int delay, int duration) { // add custom *in animations for your views // eg original snackbar uses alpha animation, from 0 to 1 ViewCompat.setScaleY(content, 0f); ViewCompat.animate(content) .scaleY(1f).setDuration(duration) .setStartDelay(delay); } @Override public void animateContentOut(int delay, int duration) { // add custom *out animations for your views // eg original snackbar uses alpha animation, from 1 to 0 ViewCompat.setScaleY(content, 1f); ViewCompat.animate(content) .scaleY(0f) .setDuration(duration) .setStartDelay(delay); } } } 

IV. Ajouter une méthode pour créer une Snackbar avec une disposition personnalisée et des méthodes pour le remplir.

 public class final CustomSnackbar ...{ ... public static CustomSnackbar make(ViewGroup parent, @Duration int duration) { // inflate custom layout LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View content = inflater.inflate(R.layout.snackbar_view, parent, false); // create snackbar with custom view ContentViewCallback callback= new ContentViewCallback(content); CustomSnackbar customSnackbar = new CustomSnackbar(parent, content, callback); // Remove black background padding on left and right customSnackbar.getView().setPadding(0, 0, 0, 0); // set snackbar duration customSnackbar.setDuration(duration); return customSnackbar; } // set text in custom layout public CustomSnackbar setText(CharSequence text) { TextView textView = (TextView) getView().findViewById(R.id.snackbar_text); textView.setText(text); return this; } // set action in custom layout public CustomSnackbar setAction(CharSequence text, final OnClickListener listener) { Button actionView = (Button) getView().findViewById(R.id.snackbar_action); actionView.setText(text); actionView.setVisibility(View.VISIBLE); actionView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { listener.onClick(view); // Now dismiss the Snackbar dismiss(); } }); return this; } } 

V. Créer une instance de CustomSnackbar et appeler la méthode show() .

 CustomSnackbar customSnackbar = CustomSnackbar.make(rooView, CustomSnackbar.LENGTH_INDEFINITE); customSnackbar.setText("No network connection!"); customSnackbar.setAction("Retry", new View.OnClickListener() { @Override public void onClick(View v) { // handle click here } }); customSnackbar.show(); 

En savoir plus sur Snackbar et sa personnalisation sur materialdoc.com

Code complet de CustomSnackbar.class :

 import android.support.annotation.NonNull; import android.support.design.widget.BaseTransientBottomBar; import android.support.v4.view.ViewCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; public class CustomSnackbar extends BaseTransientBottomBar { /** * Constructor for the transient bottom bar. * * @param parent The parent for this transient bottom bar. * @param content The content view for this transient bottom bar. * @param callback The content view callback for this transient bottom bar. */ private CustomSnackbar(ViewGroup parent, View content, ContentViewCallback callback) { super(parent, content, callback); } public static CustomSnackbar make(@NonNull ViewGroup parent, @Duration int duration) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final View content = inflater.inflate(R.layout.snackbar_view, parent, false); final ContentViewCallback viewCallback = new ContentViewCallback(content); final CustomSnackbar customSnackbar = new CustomSnackbar(parent, content, viewCallback); customSnackbar.getView().setPadding(0, 0, 0, 0); customSnackbar.setDuration(duration); return customSnackbar; } public CustomSnackbar setText(CharSequence text) { TextView textView = (TextView) getView().findViewById(R.id.snackbar_text); textView.setText(text); return this; } public CustomSnackbar setAction(CharSequence text, final View.OnClickListener listener) { Button actionView = (Button) getView().findViewById(R.id.snackbar_action); actionView.setText(text); actionView.setVisibility(View.VISIBLE); actionView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { listener.onClick(view); // Now dismiss the Snackbar dismiss(); } }); return this; } private static class ContentViewCallback implements BaseTransientBottomBar.ContentViewCallback { private View content; public ContentViewCallback(View content) { this.content = content; } @Override public void animateContentIn(int delay, int duration) { ViewCompat.setScaleY(content, 0f); ViewCompat.animate(content).scaleY(1f).setDuration(duration).setStartDelay(delay); } @Override public void animateContentOut(int delay, int duration) { ViewCompat.setScaleY(content, 1f); ViewCompat.animate(content).scaleY(0f).setDuration(duration).setStartDelay(delay); } } } 

La manière XML:

Le fichier XML de mise en page d’origine utilisé pour la Snackbar est ce fichier:

design_layout_snackbar_include.xml :

       

Donc, pour remplacer cette mise en page, vous devez écrire votre propre mise en page avec le même android:id comme dans celui-ci et dans votre fichier refs.xml , vous devez append cette ligne:

  ....  @layout/my_layout_snackbar  ....  

La réponse est: Ne personnalisez pas la Snackbar. Il ne doit pas contenir plus d’éléments qu’un texte court et une action. Voir les directives de conception de Google Material .

MISE À JOUR: Si vous souhaitez personnaliser le Snackbar, voici ce que j’ai implémenté dans mon application:

 //generate the snackbar Snackbar sb = Snackbar.make(rootView, snack.text, duration); //set te action button text color sb.setActionTextColor(mCurrentActivity.getResources().getColor(R.color.snack_text_action)); //Get the view of the snackbar View sbView = sb.getView(); //set background color sbView.setBackgroundColor(mCurrentActivity.getResources().getColor(backgroudResId)); //Get the textview of the snackbar text TextView textView = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text); //set text color textView.setTextColor(mCurrentActivity.getResources().getColor(R.color.snack_text)); //increase max lines of text in snackbar. default is 2. textView.setMaxLines(10); 

Je n’ai jamais essayé, mais avec l’affichage racine de la Snackbar, vous pouvez append par programme de nouvelles vues à la Snackbar.

Essayez le code suivant.

 Snackbar snackbar = Snackbar.make(container, "No Internet Connection", Snackbar.LENGTH_LONG); View sbView = snackbar.getView(); sbView.setBackgroundColor(ContextCompat.getColor(this, R.color.colorPrimary)); snackbar.show(); 

Remarque:

conteneur – vue parent de la mise en page.

Je l’ai essayé et il fonctionne!

  View custom = LayoutInflater.from(this).inflate(R.layout.custom_view, null); snackbar.getView().setPadding(0,0,0,0); ((ViewGroup) snackbar.getView()).removeAllViews(); ((ViewGroup) snackbar.getView()).addView(custom); TextView textView = custom.findViewById(R.id.text); View button = custom.findViewById(R.id.button); textView.setText("Your text here"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // do something } }); 

Vous pouvez essayer cette bibliothèque. Ceci est un wrapper pour Android snackbar par défaut. https://github.com/ChathuraHettiarachchi/CSnackBar

 Snackbar.with(this,null) .type(Type.SUCCESS) .message("Profile updated successfully!") .duration(Duration.SHORT) .show(); 

ou vous pouvez même utiliser votre propre sharepoint vue,

 View view = getLayoutInflater().inflate(R.layout.custom_view, null); Snackbar.with(this,null) .type(Type.UPDATE) .contentView(view, 76) .duration(Duration.SHORT) .show(); 

Actuellement, seul le problème avec la mise en page personnalisée est, nous devons passer la hauteur de vue en dp en entrée

 private Snackbar showSnackbar() { // Create the Snackbar Snackbar snackbar = Snackbar.make(coordinatorLayout, "", length); // 15 is margin from all the sides for snackbar int marginFromSides = 15; float hei[![enter image description here][1]][1]ght = 100; //inflate view View snackView = getLayoutInflater().inflate(R.layout.snackbar_layout, null); // White background snackbar.getView().setBackgroundColor(Color.WHITE); // for rounded edges snackbar.getView().setBackground(getResources().getDrawable(R.drawable.round_edges)); Snackbar.SnackbarLayout snackBarView = (Snackbar.SnackbarLayout) snackbar.getView(); FrameLayout.LayoutParams parentParams = (FrameLayout.LayoutParams) snackBarView.getLayoutParams(); parentParams.setMargins(marginFromSides, 0, marginFromSides, marginFromSides); parentParams.height = (int) height; parentParams.width = FrameLayout.LayoutParams.MATCH_PARENT; snackBarView.setLayoutParams(parentParams); snackBarView.addView(snackView, 0); return snackbar; } final Snackbar snackbar = showSnackbar(mainLayout, 90, Snackbar.LENGTH_LONG, R.layout.snackbar_layout); snackbar.show(); View view = snackbar.getView(); TextView tv = (TextView) view.findViewById(R.id.snackbar_action); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { snackbar.dismiss(); } }); 

Pour append à la réponse de Yakiv Mospan, pour faire apparaître votre BaseTransientBottomBar personnalisée depuis le bas comme une Snackbar , copiez cette méthode de la classe Snackbar pour trouver un parent approprié pour le constructeur BaseTransientBottomBar .

 private static ViewGroup findSuitableParent(View view) { ViewGroup fallback = null; do { if (view instanceof CoordinatorLayout) { // We've found a CoordinatorLayout, use it return (ViewGroup) view; } else if (view instanceof FrameLayout) { if (view.getId() == android.R.id.content) { // If we've hit the decor content view, then we didn't find a CoL in the // hierarchy, so use it. return (ViewGroup) view; } else { // It's not the content view but we'll use it as our fallback fallback = (ViewGroup) view; } } if (view != null) { // Else, we will loop and crawl up the view hierarchy and try to find a parent final ViewParent parent = view.getParent(); view = parent instanceof View ? (View) parent : null; } } while (view != null); // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback return fallback; }