Como mostrar o Snackbar quando a atividade começa?

98

Quero mostrar ao android Snackbar (android.support.design.widget.Snackbar)quando a atividade começa, assim como mostramos a Toast.

Mas o problema é que temos que especificar o layout pai ao criar Snackbarassim:

Snackbar.make(parentlayout, "This is main activity", Snackbar.LENGTH_LONG)
            .setAction("CLOSE", new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            })
            .setActionTextColor(getResources().getColor(android.R.color.holo_red_light ))
            .show();

Como dar o layout pai quando mostramos Snackbarno início da atividade sem nenhum evento de clique (se fosse um evento de clique, poderíamos facilmente passar pela visualização pai)?

Sudheesh Mohan
fonte
1
Artigo escrito para onetouchcode.com/2016/12/24/use-snackbar-android-apps , Isso será útil para saber mais detalhes sobre Snackbar
Shailendra
exemplo
snackbar

Respostas:

211

Basta apontar para qualquer Viewdentro do Activity'sXML. Você pode fornecer um id ao viewGroup raiz, por exemplo, e usar:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);    
   setContentView(R.layout.main_activity);
   View parentLayout = findViewById(android.R.id.content);
   Snackbar.make(parentLayout, "This is main activity", Snackbar.LENGTH_LONG) 
        .setAction("CLOSE", new View.OnClickListener() {
            @Override 
            public void onClick(View view) {

            } 
        }) 
        .setActionTextColor(getResources().getColor(android.R.color.holo_red_light ))
        .show(); 
   //Other stuff in OnCreate();
}
David Corsalini
fonte
57
Para a visualização da raiz, geralmente você também pode usar findViewById(android.R.id.content)conforme indicado aqui stackoverflow.com/a/4488149/1518546
John Cummings
Exibir parentLayout = findViewById (R.id.root_view); lança exceção nullpointer na versão 5.0 ou inferior. Como resolver este problema ?
Anand Savjani
1
@AnandSavjani O código está funcionando perfeitamente comigo para 5.0 e abaixo de 5.0, deve haver algum erro no seu layout (root_view). Se você estiver usando um fragmento, deve escrever rootview.findViewById (R.id.your_parent_view); E também não dê o mesmo id do nome do layout.
Sudheesh Mohan
Eu acredito que ele lança NullpointerException se você não estiver usando CoordinatorLayout como raiz.
Ishaan,
Não se esqueça de incluir a biblioteca de design de suporte: 'com.android.support:design:27.0.0'
Nikola
27

Eu tive problemas para exibir o Snackbar até agora. Esta é a maneira mais simples de exibir um Snackbar. Para exibi-lo como seu início de atividade principal, basta colocar essas duas linhas dentro deOnCreate()

    Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Welcome To Main Activity", Snackbar.LENGTH_LONG);
    snackbar.show();

PS Apenas certifique-se de ter importado o Android Design Support (conforme mencionado na pergunta).

Para Kotlin,

Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_SHORT).show()
devDeejay
fonte
8

Tente isto

Snackbar.make(findViewById(android.R.id.content), "Got the Result", Snackbar.LENGTH_LONG)
                        .setAction("Submit", mOnClickListener)
                        .setActionTextColor(Color.RED)
                        .show();
Maomé
fonte
3

chame este método em onCreate

Snackbar snack = Snackbar.make(
                    (((Activity) context).findViewById(android.R.id.content)),
                    message + "", Snackbar.LENGTH_SHORT);
snack.setDuration(Snackbar.LENGTH_INDEFINITE);//change Duration as you need
            //snack.setAction(actionButton, new View.OnClickListener());//add your own listener
            View view = snack.getView();
            TextView tv = (TextView) view
                    .findViewById(android.support.design.R.id.snackbar_text);
            tv.setTextColor(Color.WHITE);//change textColor

            TextView tvAction = (TextView) view
                    .findViewById(android.support.design.R.id.snackbar_action);
            tvAction.setTextSize(16);
            tvAction.setTextColor(Color.WHITE);

            snack.show();
AndroidGeek
fonte
2

Uma função utils para show lanchonete

fun showSnackBar(activity: Activity, message: String, action: String? = null,
    actionListener: View.OnClickListener? = null, duration: Int = Snackbar.LENGTH_SHORT) {
    val snackBar = Snackbar.make(activity.findViewById(android.R.id.content), message, duration)
        .setBackgroundColor(Color.parseColor("#CC000000")) // todo update your color
        .setTextColor(Color.WHITE)
    if (action != null && actionListener!=null) {
        snackBar.setAction(action, actionListener)
    }
    snackBar.show()
}

Exemplo usando em atividade

  showSnackBar(this, "No internet")
  showSnackBar(this, "No internet", duration = Snackbar.LENGTH_LONG)
  showSnackBar(activity, "No internet", "OK", View.OnClickListener { 
       // handle click 
  })

Exemplo usando em Fragment

  showSnackBar(getActivity(), "No internet")

Espero que ajude

Phan Van Linh
fonte
1

Você pode experimentar esta biblioteca. Este é um wrapper para snackbar padrão do Android. https://github.com/ChathuraHettiarachchi/CSnackBar

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

Este contém vários tipos de snackbar e até mesmo um snackbar integrado de visualização personalizada

Chathura Jayanath
fonte
1

Isso pode ser feito simplesmente usando os seguintes códigos dentro de onCreate. Usando o layout padrão do Android

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();
Jarin Rocks
fonte
na versão 5.x do Android - getWindow().getDecorView()retornar de repente a tela TODA, incluir 'botões inferiores' (como home, back etc). Então, meu lanche estava aparecendo nestes botões, não no app
alena_fox_spb
verifique a resposta atualizada. Isso resolverá seu problema. Usar o layout padrão do Android
Jarin Rocks
sim, quando mudei de windowpara android.R.id.contenttodos começar a trabalhar. Então, escrevi meu comentário para resolver o problema de outra pessoa com ele no futuro)
alena_fox_spb
0

Você também pode definir uma superclasse para todas as suas atividades e encontrar a visualização uma vez na atividade pai.

por exemplo

AppActivity.java:

public class AppActivity extends AppCompatActivity {

    protected View content;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        changeLanguage("fa");
        content = findViewById(android.R.id.content);
    }
}

e seus lanches ficariam assim em todas as atividades em seu aplicativo:

Snackbar.make(content, "hello every body", Snackbar.LENGTH_SHORT).show();

É melhor para o desempenho que você encontre a visualização uma vez para cada atividade.

M.Kasaei
fonte