Bagaimana cara menampilkan Snackbar saat Aktivitas dimulai?

99

Saya ingin menampilkan android Snackbar (android.support.design.widget.Snackbar)saat aktivitas dimulai seperti yang kami tampilkan Toast.

Tetapi masalahnya adalah kita harus menentukan tata letak induk saat membuat Snackbarseperti ini:

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

Bagaimana cara memberikan tata letak induk ketika kita menampilkan Snackbardi awal aktivitas tanpa peristiwa klik apa pun (Jika itu adalah peristiwa klik, kita bisa dengan mudah meneruskan tampilan induk)?

Sudheesh Mohan
sumber
1
Menulis artikel ke onetouchcode.com/2016/12/24/use-snackbar-android-apps , Ini akan membantu untuk mengetahui lebih banyak detail dari Snackbar
Shailendra

Jawaban:

214

Tunjuk saja ke Viewdalam Activity'sXML. Anda dapat memberikan id ke root viewGroup, misalnya, dan menggunakan:

@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
sumber
58
Untuk tampilan root, biasanya Anda juga dapat menggunakan findViewById(android.R.id.content)seperti yang ditunjukkan di sini stackoverflow.com/a/4488149/1518546
John Cummings
Lihat parentLayout = findViewById (R.id.root_view); melempar pengecualian nullpointer dalam versi 5.0 atau lebih rendah. Bagaimana cara mengatasi masalah ini?
Anand Savjani
1
@AnandSavjani Kode bekerja sempurna dengan saya untuk 5.0 dan di bawah 5.0, pasti ada beberapa kesalahan dalam tata letak Anda (root_view). Jika Anda menggunakan fragmen, Anda harus menulis rootview.findViewById (R.id.your_parent_view); Dan juga jangan berikan id yang sama dengan nama layout.
Sudheesh Mohan
Saya yakin ini akan melempar NullpointerException jika Anda tidak menggunakan CoordinatorLayout sebagai root.
Ishaan
Jangan lupa untuk menyertakan pustaka desain dukungan: 'com.android.support:design:27.0.0'
Nikola
27

Saya kesulitan menampilkan Snackbar sampai sekarang. Berikut adalah cara termudah untuk menampilkan Snackbar. Untuk menampilkannya sebagai Aktivitas Utama Anda Mulai, cukup letakkan dua baris ini di dalam fileOnCreate()

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

PS Pastikan Anda telah mengimpor Dukungan Desain Android. (Seperti disebutkan dalam pertanyaan).

Untuk Kotlin,

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

Coba ini

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

panggil metode ini di 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
sumber
2

Fungsi utilitas untuk 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()
}

Contoh penggunaan di Activity

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

Contoh penggunaan di Fragment

  showSnackBar(getActivity(), "No internet")

Semoga membantu

Phan Van Linh
sumber
1

Anda dapat mencoba perpustakaan ini. Ini adalah pembungkus untuk snackbar default android. https://github.com/ChathuraHettiarachchi/CSnackBar

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

Ini berisi beberapa jenis snackbar dan bahkan snackbar terintegrasi customview

Chathura Jayanath
sumber
1

Ini dapat dilakukan hanya dengan menggunakan kode berikut di dalam onCreate. Dengan menggunakan tata letak default android

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();
Jarin Rocks
sumber
di Android versi 5.x - tiba-tiba getWindow().getDecorView()mengembalikan SEMUA layar, termasuk 'tombol bawah' (seperti home, back dll). Jadi camilan saya muncul di tombol ini, bukan di aplikasi
alena_fox_spb
periksa jawaban yang diperbarui. Ini akan menyelesaikan masalah Anda. Gunakan tata letak default android
Jarin Rocks
ya, ketika saya berubah dari windowke android.R.id.contentsemua start kerja. Jadi saya menulis komentar saya untuk menyelesaikan masalah orang lain dengannya di masa mendatang)
alena_fox_spb
0

Anda juga dapat menentukan kelas super untuk semua aktivitas Anda dan menemukan tampilan sekali dalam aktivitas induk.

sebagai contoh

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

dan camilan Anda akan terlihat seperti ini di setiap aktivitas di aplikasi Anda:

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

Lebih baik untuk kinerja Anda harus menemukan tampilan sekali untuk setiap aktivitas.

M.Kasaei
sumber