O Snackbar não permite que você defina um layout personalizado. No entanto, como Primoz990 sugeriu, você pode obter a Visualização do Snackbar. A função getView retorna Snackbar.SnackbarLayout, que é um objeto LinearLayout horizontal cujos filhos são um TextView e um Button. Para adicionar sua própria Visualização ao Snackbar, você só precisa ocultar o TextView e adicionar sua Visualização ao 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();
É possível a partir da revisão 25.1.0 da Biblioteca de Suporte Android
I. Declare o layout personalizado em sua pasta de valores / layout.
Dicas:
@dimen/design_snackbar
valores para corresponder às diretrizes do material design.?attr/colorAccent
para aplicar as alterações do tema do aplicativo ao Snackbar.II. Estenda a classe BaseTransientBottomBar .
III. Adicionar BaseTransientBottomBar.ContentViewCallback
IV. Adicionar método para criar Snackbar com layout personalizado e métodos para preenchê-lo.
V. Crie uma instância de
CustomSnackbar
umshow()
método de chamada .Veja mais sobre Snackbar e sua personalização em materialdoc.com
CustomSnackbar.class
Código completo :fonte
A maneira XML:
O arquivo xml de layout original usado para
Snackbar
é este arquivo:design_layout_snackbar_include.xml
:Portanto, a fim de substituir esse layout, você deve escrever seu próprio layout com os mesmos
android:id
s que neste e em seurefs.xml
arquivo você deve adicionar esta linha:fonte
BaseTransientBottomBar
, por stackoverflow.com/a/41154330/9636A resposta é: não personalize o Snackbar. Não deve conter mais elementos do que um pequeno texto e uma ação. Consulte as diretrizes de design de materiais do Google .
ATUALIZAÇÃO: se você quiser personalizar o Snackbar, aqui está o que eu implementei em meu aplicativo:
Eu nunca tentei, mas com a obtenção da visualização raiz do Snackbar, você pode adicionar programaticamente novas visualizações ao Snackbar.
fonte
Em onCreate da atividade:
fonte
Eu tentei e funciona!
fonte
Experimente o seguinte código.
Nota:
fonte
Para adicionar à resposta de Yakiv Mospan, para tornar seu
BaseTransientBottomBar
show personalizado de baixo como umSnackbar
, copie este método daSnackbar
classe para encontrar um pai adequado para oBaseTransientBottomBar
construtor.fonte
Versão Kotlin para a resposta aceita: https://stackoverflow.com/a/33441214/2437655
fonte
Aqui está meu código de classe do utilitário para kotlin: https://gist.github.com/Ryszardenko/db429bc7d177e646ffe27e0672a0958c#file-customsnackbar-kt
cancelFun () é um lambda, por padrão vazio - você pode passar lá, por exemplo, a função "desfazer".
fonte
Você pode experimentar esta biblioteca. Este é um wrapper para snackbar padrão do Android. https://github.com/ChathuraHettiarachchi/CSnackBar
ou você pode até usar sua própria visão,
Atualmente, o único problema com o layout personalizado é que precisamos passar a altura da vista em dp como uma entrada
fonte