Wie zeige ich die Snackbar, wenn die Aktivität beginnt?

97

Ich möchte Android zeigen, Snackbar (android.support.design.widget.Snackbar)wenn die Aktivität beginnt, genau wie wir es zeigen Toast.

Das Problem ist jedoch, dass wir das übergeordnete Layout beim Erstellen Snackbarwie folgt angeben müssen :

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

Wie kann man ein übergeordnetes Layout festlegen, wenn es Snackbarzu Beginn der Aktivität ohne Klickereignisse angezeigt wird (Wenn es ein Klickereignis wäre, hätten wir die übergeordnete Ansicht problemlos übergeben können)?

Sudheesh Mohan
quelle
1
Geschrieben einen Artikel an onetouchcode.com/2016/12/24/use-snackbar-android-apps , Dies wird hilfreich sein, um weitere Details von Snackbar
Shailendra

Antworten:

210

Zeigen Sie einfach auf eine beliebige Stelle Viewim Activity'sXML. Sie können beispielsweise der Root-ViewGroup eine ID geben und Folgendes verwenden:

@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
quelle
57
Für die Stammansicht können Sie auch allgemein findViewById(android.R.id.content)wie hier angegeben stackoverflow.com/a/4488149/1518546
John Cummings
View parentLayout = findViewById (R.id.root_view); Löst eine Nullzeiger-Ausnahme in Version 5.0 oder niedriger aus. Wie kann man dieses Problem lösen?
Anand Savjani
1
@AnandSavjani Der Code funktioniert perfekt mit mir für 5.0 und unter 5.0, es muss ein Fehler in Ihrem Layout sein (root_view). Wenn Sie ein Fragment verwenden, sollten Sie rootview.findViewById (R.id.your_parent_view) schreiben. Und geben Sie auch nicht die gleiche ID wie der Layoutname an.
Sudheesh Mohan
Ich glaube, es löst eine NullpointerException aus, wenn Sie CoordinatorLayout nicht als Root verwenden.
Ishaan
Vergessen Sie nicht, die Support-Design-Bibliothek einzuschließen: 'com.android.support:design:27.0.0'
Nikola
26

Ich hatte bis jetzt Probleme, die Snackbar anzuzeigen. Hier ist der einfachste Weg, eine Snackbar anzuzeigen. Um es als Start Ihrer Hauptaktivität anzuzeigen, setzen Sie einfach diese beiden Zeilen in IhreOnCreate()

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

PS Stellen Sie einfach sicher, dass Sie den Android Design Support importiert haben (wie in der Frage erwähnt).

Für Kotlin

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

Versuche dies

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

Rufen Sie diese Methode in onCreate auf

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();
Zar E Ahmer
quelle
2

Eine Utils-Funktion für die Show-Snackbar

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

Beispiel mit in Aktivität

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

Beispiel mit in Fragment

  showSnackBar(getActivity(), "No internet")

Hoffe es hilft

Phan Van Linh
quelle
1

Sie können diese Bibliothek ausprobieren. Dies ist ein Wrapper für Android Standard Snackbar. https://github.com/ChathuraHettiarachchi/CSnackBar

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

Diese enthält mehrere Arten von Snackbars und sogar eine integrierte Snackbar mit benutzerdefinierter Ansicht

Chathura Jayanath
quelle
1

Dies kann einfach mithilfe der folgenden Codes in onCreate erfolgen. Mit dem Standardlayout von Android

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();
Jarin Rocks
quelle
auf Android Version 5.x - plötzlich getWindow().getDecorView()ALLE Bildschirm zurückgeben, 'Bottom Buttons' (wie Home, Back usw.) enthalten. Mein Snack zeigte sich also bis zu diesen Schaltflächen, nicht in der App
alena_fox_spb
Überprüfen Sie die aktualisierte Antwort. Es wird Ihr Problem lösen. Verwenden Sie das Standardlayout von Android
Jarin Rocks
Ja, als ich von windowzu android.R.id.contentallen wechselte, fange ich an zu arbeiten. Also schrieb ich meinen Kommentar, um ein anderes Problem in Zukunft zu lösen)
alena_fox_spb