Làm thế nào để hiển thị Snackbar khi Hoạt động bắt đầu?


98

Tôi muốn hiển thị android Snackbar (android.support.design.widget.Snackbar)khi hoạt động bắt đầu giống như chúng tôi hiển thị a Toast.

Nhưng vấn đề là chúng ta phải chỉ định bố cục mẹ khi tạo Snackbarnhư thế này:

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

Làm thế nào để cung cấp bố cục gốc khi chúng tôi hiển thị Snackbarkhi bắt đầu hoạt động mà không có bất kỳ sự kiện nhấp chuột nào (Nếu đó là sự kiện nhấp chuột, chúng tôi có thể dễ dàng vượt qua chế độ xem chính)?


1
Viết một bài báo để onetouchcode.com/2016/12/24/use-snackbar-android-apps , này sẽ rất hữu ích để biết thêm chi tiết của Snackbar
Shailendra

Câu trả lời:


211

Chỉ cần trỏ đến bất kỳ Viewbên trong Activity'sXML. Ví dụ: bạn có thể cung cấp một id cho viewGroup gốc và sử dụng:

@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
Để có cái nhìn root, bạn cũng có thể sử dụng chung findViewById(android.R.id.content)như đã nêu ở đây stackoverflow.com/a/4488149/1518546
John Cummings

Xem parentLayout = findViewById (R.id.root_view); ném ngoại lệ nullpointer trong phiên bản 5.0 trở xuống. Làm thế nào để giải quyết vấn đề này ?
Anand Savjani,

1
@AnandSavjani Mã đang hoạt động hoàn hảo với tôi cho 5.0 và dưới 5.0, chắc chắn có một số lỗi trong bố cục của bạn (root_view). Nếu bạn đang sử dụng phân mảnh, bạn nên viết rootview.findViewById (R.id.your_parent_view); Và cũng không cung cấp id giống như tên bố cục.
Sudheesh Mohan

Tôi tin rằng nó ném NullpointerException nếu bạn không sử dụng CoordinatorLayout làm gốc.
Ishaan

Đừng quên bao gồm thư viện thiết kế hỗ trợ: 'com.android.support:design:27.0.0'
Nikola

26

Tôi đã gặp sự cố khi hiển thị Snackbar cho đến nay. Đây là cách đơn giản nhất để hiển thị Snackbar. Để hiển thị nó dưới dạng Bắt đầu hoạt động chính của bạn, chỉ cần đặt hai dòng này bên trongOnCreate()

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

PS Chỉ cần đảm bảo rằng bạn đã nhập Hỗ trợ thiết kế Android. (Như đã đề cập trong câu hỏi).

Đối với Kotlin,

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

8

Thử cái này

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

3

gọi phương thức này trong 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

Một chức năng utils cho quán ăn nhanh

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

Ví dụ sử dụng trong Activity

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

Ví dụ sử dụng trong Fragment

  showSnackBar(getActivity(), "No internet")

Hy vọng nó sẽ giúp


1

Bạn có thể thử thư viện này. Đây là một trình bao bọc cho thanh đồ ăn nhanh mặc định của Android. https://github.com/ChathuraHettiarachchi/CSnackBar

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

Điều này chứa nhiều loại thanh ăn nhanh và thậm chí là thanh ăn nhẹ tích hợp tùy chỉnh


1

Nó có thể được thực hiện đơn giản bằng cách sử dụng các mã sau bên trong onCreate. Bằng cách sử dụng bố cục mặc định của android

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

trên phiên bản android 5.x - đột nhiên getWindow().getDecorView()trả lại TẤT CẢ màn hình, bao gồm 'các nút dưới cùng' (chẳng hạn như trang chủ, quay lại, v.v.). Vì vậy, món ăn của tôi đã cho thấy xuống nút này, không phải trong ứng dụng
alena_fox_spb

kiểm tra câu trả lời cập nhật. Nó sẽ giải quyết vấn đề của bạn. Bố trí mặc định sử dụng Android của
Jarin Rocks

vâng, khi tôi thay đổi từ windowđể android.R.id.contenttất cả bắt đầu công việc. Vì vậy, tôi đã viết nhận xét của tôi để giải quyết vấn đề ai đó khác với nó trong tương lai)
alena_fox_spb

0

Bạn cũng có thể xác định một siêu lớp cho tất cả các hoạt động của mình và tìm chế độ xem một lần trong hoạt động chính.

ví dụ

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

và đồ ăn nhẹ của bạn sẽ trông giống như thế này trong mọi hoạt động trong ứng dụng của bạn:

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

Tốt hơn cho hiệu suất, bạn phải tìm chế độ xem một lần cho mọi hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.