Le Snackbar ne vous permet pas de définir une disposition personnalisée. Cependant, comme Primoz990 l'a suggéré, vous pouvez obtenir la vue du Snackbar. La fonction getView renvoie le Snackbar.SnackbarLayout, qui est un objet LinearLayout horizontal dont les enfants sont un TextView et un Button. Pour ajouter votre propre vue au Snackbar, il vous suffit de masquer le TextView et d'ajouter votre vue au 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();
Il 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 valeurs / mise en page.
Conseils:
@dimen/design_snackbar
valeurs correspondant aux directives de conception des matériaux.?attr/colorAccent
pour appliquer les modifications de votre thème d'application à Snackbar.II. Étendez la classe BaseTransientBottomBar .
III. Ajouter BaseTransientBottomBar.ContentViewCallback
IV. Ajoutez une méthode pour créer Snackbar avec une disposition personnalisée et des méthodes pour le remplir.
V. Créez une instance
CustomSnackbar
et appelez lashow()
méthode.En savoir plus sur Snackbar et sa personnalisation sur materialdoc.com
CustomSnackbar.class
Code complet :la source
La manière XML:
Le fichier xml de mise en page d'origine utilisé pour le
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 les mêmes
android:id
s que dans celle-ci et dans votrerefs.xml
fichier, vous devez ajouter cette ligne:la source
BaseTransientBottomBar
, par stackoverflow.com/a/41154330/9636La réponse est: ne personnalisez pas le Snackbar. Il ne doit pas contenir plus d'éléments qu'un court texte et une action. Consultez les consignes de conception de matériel de Google .
MISE À JOUR: Si vous souhaitez quand même personnaliser le Snackbar, voici ce que j'ai implémenté dans mon application:
Je n'ai jamais essayé, mais en obtenant la vue racine du Snackbar, vous pouvez ajouter par programme de nouvelles vues au Snackbar.
la source
Dans onCreate de l'activité:
la source
Je l'ai essayé et il fonctionne!
la source
Essayez le code suivant.
Remarque:
la source
Pour ajouter à la réponse de Yakiv Mospan, pour que votre
BaseTransientBottomBar
exposition personnalisée du bas ressemble à unSnackbar
, copiez cette méthode de laSnackbar
classe pour trouver un parent approprié pour leBaseTransientBottomBar
constructeur.la source
Version Kotlin pour la réponse acceptée: https://stackoverflow.com/a/33441214/2437655
la source
Voici mon code de classe util pour kotlin: https://gist.github.com/Ryszardenko/db429bc7d177e646ffe27e0672a0958c#file-customsnackbar-kt
cancelFun () est un lambda, vide par défaut - vous pouvez y passer par exemple la fonction "undo".
la source
Vous pouvez essayer cette bibliothèque. Ceci est un wrapper pour le snackbar par défaut Android. https://github.com/ChathuraHettiarachchi/CSnackBar
ou vous pouvez même utiliser votre propre vue,
Actuellement, le seul problème avec la mise en page personnalisée est que nous devons transmettre la hauteur de vue dans dp en tant qu'entrée
la source