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.