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)?


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

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

8

Versuche dies

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

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

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


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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.