Jak pokazać Snackbar po rozpoczęciu aktywności?

103

Chcę pokazać androidowi, Snackbar (android.support.design.widget.Snackbar)kiedy zaczyna się aktywność, tak jak pokazujemy Toast.

Problem polega jednak na tym, że podczas tworzenia w Snackbarten sposób musimy określić układ nadrzędny :

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

Jak nadać układ nadrzędny, gdy pokazujemy Snackbarna początku działania bez żadnych kliknięć (gdyby było to zdarzenie kliknięcia, moglibyśmy łatwo przekazać widok nadrzędny)?

Sudheesh Mohan
źródło
1
Napisałem artykuł do onetouchcode.com/2016/12/24/use-snackbar-android-apps , Będzie to pomocne, aby dowiedzieć się więcej o Snackbar
Shailendra

Odpowiedzi:

221

Po prostu wskaż dowolną pozycję Vieww Activity'skodzie XML. Możesz na przykład nadać identyfikator głównej grupie viewGroup i użyć:

@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
źródło
59
W przypadku widoku głównego można również ogólnie używać, findViewById(android.R.id.content)jak wskazano tutaj stackoverflow.com/a/4488149/1518546
John Cummings
Wyświetl parentLayout = findViewById (R.id.root_view); zgłasza wyjątek nullpointer w wersji 5.0 lub niższej. Jak rozwiązać ten problem?
Anand Savjani
1
@AnandSavjani Kod działa doskonale ze mną w wersji 5.0 i poniżej 5.0, musi być jakiś błąd w Twoim układzie (root_view). Jeśli używasz fragmentu, powinieneś napisać rootview.findViewById (R.id.your_parent_view); A także nie podawaj tego samego identyfikatora, co nazwa układu.
Sudheesh Mohan
Uważam, że zgłasza NullpointerException, jeśli nie używasz CoordinatorLayout jako katalogu głównego.
Ishaan,
Nie zapomnij dołączyć biblioteki projektów wsparcia: „com.android.support:design:27.0.0”
Nikola
30

Do tej pory miałem problemy z wyświetlaniem Snackbar. Oto najprostszy sposób wyświetlenia Snackbara. Aby wyświetlić go jako początek głównego działania, po prostu umieść te dwie linie w swoimOnCreate()

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

PS Po prostu upewnij się, że zaimportowałeś wsparcie projektowania Androida (jak wspomniano w pytaniu).

Dla Kotlina,

Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_SHORT).show()
devDeejay
źródło
8

Spróbuj tego

Snackbar.make(findViewById(android.R.id.content), "Got the Result", Snackbar.LENGTH_LONG)
                        .setAction("Submit", mOnClickListener)
                        .setActionTextColor(Color.RED)
                        .show();
Mohammad
źródło
3

wywołaj tę metodę w 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
źródło
2

Funkcja przyborów do pokazowego baru z przekąskami

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

Przykład użycia w ćwiczeniu

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

Przykład użycia we fragmencie

  showSnackBar(getActivity(), "No internet")

Mam nadzieję, że to pomoże

Phan Van Linh
źródło
1

Możesz wypróbować tę bibliotekę. To jest opakowanie dla domyślnego paska przekąskowego Androida. https://github.com/ChathuraHettiarachchi/CSnackBar

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

Zawiera wiele rodzajów batonów, a nawet niestandardowy bar przekąskowy zintegrowany

Chathura Jayanath
źródło
1

Można to zrobić po prostu za pomocą poniższych kodów w onCreate. Korzystając z domyślnego układu Androida

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();
Jarin Rocks
źródło
na Androidzie w wersji 5.x - nagle getWindow().getDecorView()przywróć WSZYSTKIE ekrany, dołącz „dolne przyciski” (np. strona główna, wstecz itp.). Więc moja przekąska wyświetlała się do tych przycisków, a nie w aplikacji
alena_fox_spb
sprawdź zaktualizowaną odpowiedź. To rozwiąże twój problem. Użyj domyślnego układu Androida
Jarin Rocks
tak, kiedy zmieniłem się z windowna android.R.id.contentwszystko zaczynam pracę. Napisałem więc swój komentarz, aby rozwiązać w przyszłości
jakiś
0

Możesz także zdefiniować superklasę dla wszystkich swoich działań i znaleźć widok w czynności rodzica.

na przykład

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

a Twoje przekąski będą wyglądać tak w każdej aktywności w Twojej aplikacji:

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

Lepiej dla wydajności, gdy dla każdej czynności musisz znaleźć widok raz.

M.Kasaei
źródło