Come mostrare Snackbar quando inizia l'attività?


98

Voglio mostrare Android Snackbar (android.support.design.widget.Snackbar)quando inizia l'attività proprio come mostriamo un file Toast.

Ma il problema è che dobbiamo specificare il layout principale quando creiamo in Snackbarquesto modo:

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();

Come fornire il layout principale quando mostriamo Snackbarall'inizio dell'attività senza eventi di clic (se fosse un evento di clic avremmo potuto facilmente passare la visualizzazione principale)?


1
Scritto un articolo su onetouchcode.com/2016/12/24/use-snackbar-android-apps , Questo sarà utile per conoscere maggiori dettagli di Snackbar
Shailendra

Risposte:


212

Indica semplicemente uno qualsiasi Viewall'interno Activity'sdell'XML. Puoi dare un ID al viewGroup root, ad esempio, e usare:

@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();
}

57
Per la visualizzazione radice, puoi anche generalmente utilizzare findViewById(android.R.id.content)come indicato qui stackoverflow.com/a/4488149/1518546
John Cummings

Visualizza parentLayout = findViewById (R.id.root_view); genera l'eccezione nullpointer nella versione 5.0 o inferiore. Come risolvere questo problema?
Anand Savjani

1
@AnandSavjani Il codice funziona perfettamente con me per 5.0 e precedenti 5.0, ci deve essere qualche errore nel layout (root_view). Se stai usando fragment dovresti scrivere rootview.findViewById (R.id.your_parent_view); Inoltre, non fornire lo stesso ID del nome del layout.
Sudheesh Mohan

Credo che generi NullpointerException se non stai usando CoordinatorLayout come root.
Ishaan

Non dimenticare di includere la libreria di progettazione di supporto: "com.android.support:design:27.0.0"
Nikola

27

Finora ho avuto problemi a mostrare Snackbar. Ecco il modo più semplice per visualizzare uno Snackbar. Per visualizzarlo come inizia la tua attività principale, inserisci queste due linee all'interno del tuo fileOnCreate()

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

PS Assicurati solo di aver importato il supporto per il design Android (come menzionato nella domanda).

Per Kotlin,

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

8

Prova questo

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

3

chiama questo metodo in 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();

2

Una funzione utils per show snack bar

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()
}

Esempio di utilizzo in Activity

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

Esempio utilizzando in Fragment

  showSnackBar(getActivity(), "No internet")

Spero che aiuti


1

Puoi provare questa libreria. Questo è un wrapper per la snackbar predefinita di Android. https://github.com/ChathuraHettiarachchi/CSnackBar

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

Questo contiene diversi tipi di snackbar e persino uno snackbar integrato con visualizzazione personalizzata


1

Può essere fatto semplicemente utilizzando i seguenti codici all'interno di onCreate. Utilizzando il layout predefinito di Android

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();

su Android 5.x - getWindow().getDecorView()torna improvvisamente a TUTTA la schermata, includi i "pulsanti in basso" (come home, back, ecc.). Quindi il mio spuntino veniva mostrato a questi pulsanti, non nell'app
alena_fox_spb

controlla la risposta aggiornata. Risolverà il tuo problema. Usa il layout predefinito di Android
Jarin Rocks

si, quando sono passato da windowa android.R.id.contenttutti iniziano a lavorare. Quindi ho scritto il mio commento per risolvere il problema di qualcun altro con esso in futuro)
alena_fox_spb

0

Puoi anche definire una super classe per tutte le tue attività e trovare la vista una volta nell'attività genitore.

per esempio

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 i tuoi snack sarebbero simili a questo in ogni attività nella tua app:

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

È meglio per le prestazioni trovare la visualizzazione una volta per ogni attività.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.