จะแสดง Snackbar เมื่อกิจกรรมเริ่มได้อย่างไร


105

ฉันต้องการแสดง Android Snackbar (android.support.design.widget.Snackbar)เมื่อกิจกรรมเริ่มต้นเหมือนกับที่เราแสดงไฟล์Toast.

แต่ปัญหาคือเราต้องระบุเค้าโครงหลักเมื่อสร้างSnackbarเช่นนี้:

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

จะให้เค้าโครงหลักได้อย่างไรเมื่อเราแสดงSnackbarเมื่อเริ่มกิจกรรมโดยไม่มีเหตุการณ์คลิก (หากเป็นเหตุการณ์การคลิกเราสามารถส่งผ่านมุมมองหลักได้อย่างง่ายดาย)


2
เขียนบทความถึงonetouchcode.com/2016/12/24/use-snackbar-android-appsสิ่งนี้จะเป็นประโยชน์หากต้องการทราบรายละเอียดเพิ่มเติมของ Snackbar
Shailendra

คำตอบ:


224

เพียงชี้ไปที่ใดก็ได้ViewภายในActivity'sXML คุณสามารถให้ id กับ root viewGroup และใช้:

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

60
สำหรับมุมมองรูทโดยทั่วไปคุณสามารถใช้findViewById(android.R.id.content)ตามที่ระบุไว้ที่นี่stackoverflow.com/a/4488149/1518546
John Cummings

ดู parentLayout = findViewById (R.id.root_view); แสดงข้อยกเว้น nullpointer ในเวอร์ชัน 5.0 หรือต่ำกว่า จะแก้ปัญหานี้อย่างไร?
Anand Savjani

1
@AnandSavjani รหัสทำงานได้อย่างสมบูรณ์กับฉันสำหรับ 5.0 และต่ำกว่า 5.0 ต้องมีข้อผิดพลาดบางอย่างในเค้าโครงของคุณ (root_view) หากคุณใช้แฟรกเมนต์คุณควรเขียน rootview.findViewById (R.id.your_parent_view); และอย่าให้ id เดียวกันกับชื่อเค้าโครง
Sudheesh Mohan

ฉันเชื่อว่ามันพ่น NullpointerException ถ้าคุณไม่ได้ใช้ CoordinatorLayout เป็นรูท
Ishaan

อย่าลืมใส่ไลบรารีการออกแบบการสนับสนุน: 'com.android.support:design:27.0.0'
Nikola

32

ฉันมีปัญหาในการแสดง Snackbar จนถึงขณะนี้ นี่คือวิธีที่ง่ายที่สุดในการแสดง Snackbar หากต้องการแสดงเป็นกิจกรรมหลักเริ่มต้นเพียงแค่ใส่สองบรรทัดนี้ไว้ในไฟล์OnCreate()

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

ปล. ตรวจสอบให้แน่ใจว่าคุณได้นำเข้า Android Design Support แล้ว (ตามที่กล่าวไว้ในคำถาม)

สำหรับ Kotlin

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


3

เรียกเมธอดนี้ใน 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

ฟังก์ชันยูทิลิตี้สำหรับโชว์สแน็กบาร์

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

ตัวอย่างการใช้ในกิจกรรม

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

ตัวอย่างที่ใช้ใน Fragment

  showSnackBar(getActivity(), "No internet")

หวังว่ามันจะช่วยได้


2

สามารถทำได้ง่ายๆโดยใช้รหัสต่อไปนี้ใน onCreate โดยใช้เค้าโครงเริ่มต้นของ Android

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();

บน Android เวอร์ชัน 5.x - getWindow().getDecorView()กลับหน้าจอทั้งหมดโดยทันทีรวมถึง 'ปุ่มด้านล่าง' (เช่นบ้านหลัง ฯลฯ ) ดังนั้นของว่างของฉันจึงปรากฏที่ปุ่มนี้ไม่ใช่ในแอป
alena_fox_spb

ตรวจสอบคำตอบที่อัปเดต มันจะแก้ปัญหาของคุณ. ใช้เค้าโครงเริ่มต้นของ Android
Jarin Rocks

ใช่เมื่อฉันเปลี่ยนจากwindowเป็นการandroid.R.id.contentเริ่มงานทั้งหมด ดังนั้นฉันจึงเขียนความคิดเห็นเพื่อแก้ไขปัญหาอื่น ๆ ในอนาคต)
alena_fox_spb

1

คุณสามารถลองใช้ไลบรารีนี้ นี่คือกระดาษห่อสำหรับสแน็กบาร์เริ่มต้นของ Android https://github.com/ChathuraHettiarachchi/CSnackBar

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

ซึ่งประกอบด้วยสแน็กบาร์หลายประเภทและแม้แต่สแน็กบาร์แบบรวมมุมมองที่กำหนดเอง


0

คุณยังสามารถกำหนดระดับซูเปอร์คลาสสำหรับกิจกรรมทั้งหมดของคุณและค้นหามุมมองหนึ่งครั้งในกิจกรรมหลัก

ตัวอย่างเช่น

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

และขนมของคุณจะมีลักษณะเช่นนี้ทุกกิจกรรมในแอปของคุณ:

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

จะดีกว่าสำหรับประสิทธิภาพที่คุณต้องหามุมมองหนึ่งครั้งสำหรับทุกกิจกรรม


0

วิธีง่ายๆในการแสดงข้อความ:

Snackbar.make(view, "Sample Text", Snackbar.LENGTH_SHORT).show();

และเพื่อแสดงข้อความด้วยปุ่ม:

Snackbar.make(view, "Sample Text", Snackbar.LENGTH_SHORT).setAction("Ok", new View.OnClickListener() {
            @Override 
            public void onClick(View view) {

            } 
        }).show();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.