Làm cách nào để thay đổi màu nền của thanh ăn nhẹ?


101

Tôi đang hiển thị thanh nhanh trong DialogFragment Trong lần nhấp Tích cực của alertDialog. Đây là đoạn mã của tôi.

Snackbar snackbar = Snackbar.make(view, "Please enter customer name", Snackbar.LENGTH_LONG)
                .setAction("Action", null);
View sbView = snackbar.getView();
sbView.setBackgroundColor(Color.BLACK);
snackbar.show();

Như bạn có thể thấy màu nền quầy bar bán đồ ăn nhanh của tôi hiển thị màu trắng

Tôi đang chuyển chế độ xem phân mảnh hộp thoại sang thanh nhanh. Tôi muốn màu nền là đen? Tôi có thể làm cái này như thế nào? Tôi đang trả lại alertDialog trong DialogFragment. Và chủ đề tôi đang đặt cho hộp thoại như sau

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">

    <!-- Used for the buttons -->
    <item name="colorAccent">@color/accent</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">@color/primary</item>
    <!-- Used for the background -->
    <item name="android:background">@color/white</item>
</style>

Mặc dù tôi đang đặt màu nền thành màu trắng cho hộp thoại, nó sẽ ghi đè lên bằng cách đặt màu nền thành thanh nhanh.



cố gắng đó đã không giúp tôi ... tôi đang kêu gọi quán bar từ hộp thoại mảnh + alertDialog trong đó và tôi đang đi tích cực xem nút nhấp chuột vào snackbar
Ajinkya

Câu trả lời:


170

Thử đặt màu nền như sau:

sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.BLACK));

Nó sẽ hoạt động 100%!


50
bạn có thể cần phải làmsnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95

2
Nếu bạn tìm thấy trang này từ Google và trên giải pháp không làm việc cho bạn, bạn có thể cần phải thử cái này thay vì:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
Modu

@modu Lưu ý rằng getResources#getColorđã không được dùng nữa kể từ API cấp 23 (Marshmallow) và ContextCompat#getColorsẽ được sử dụng thay thế.
Edric

89

bạn có thể làm nó như thế này

Snackbar snackbar;
snackbar = Snackbar.make(view, "Message", Snackbar.LENGTH_SHORT);
View snackBarView = snackbar.getView();
snackBarView.setBackgroundColor(yourColor);
TextView textView = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(textColor);
snackbar.show();

1
như u có thể thấy tôi đã làm chính xác những điều tương tự nhưng nó không hiển thị trong màu đen
Ajinkya

tôi có sử dụng cùng một trong một trong những dự án của tôi, cố gắng để hiển thị nó trong hoạt động để thử nghiệm, có thể nó không được làm việc do thoại
Zubair Akber

ya nó hoạt động trên hoạt động nhưng tôi muốn nó trên đoạn hộp thoại.
Ajinkya

tôi nghĩ rằng đó là do quan điểm của bạn rằng bạn đang đi với nó
Zubair Akber

20

Nếu bạn muốn xác định màu nền cho tất cả các Snackbars của mình, chỉ cần ghi đè design_snackbar_background_colorgiá trị ở đâu đó trong tài nguyên của bạn. Ví dụ:

<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>

Giải pháp này là sạch nhất và tốt đẹp. Cảm ơn!
AloDev

1
Hoạt động tuyệt vời, chỉ cần gắn nó vào Colors.xml và bạn đã sẵn sàng!
Avi Parshan

Không. Không làm việc cho tôi. Không có bất kỳ giải pháp nào khác.
AndroidDev

20

Vì không có câu trả lời nào khác cung cấp ghi đè kiểu tùy chỉnh (mà tôi coi là một trong những cách cập nhật an toàn nhất để làm điều đó), tôi đăng giải pháp của mình ở đây.

Tôi đăng một giải pháp đã giải quyết chủ đề AndroidX( support design 28) mới .

Miễn là ứng dụng của bạn sử dụng một tùy chỉnh mà chúng được gọi MyAppThemetrong AndroidManifest.xml:

<application
        android:name=".MyApplicationName"
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        android:roundIcon="@mipmap/icon_round"
        android:label="@string/app_name"
        android:theme="@style/MyAppTheme">

Tạo (nếu bạn chưa có) values/style.xmltệp ghi đè chủ đề được ứng dụng của bạn sử dụng:

<style name="MyAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/myColorPrimary</item>
    <item name="colorPrimaryDark">@color/myColorPrimaryDark</item>
    <item name="colorAccent">@color/myColorAccent</item>
    <item name="snackbarStyle">@style/MySnackBarStyle</item>
</style>

<!-- snackbar style in res/values -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:background">@color/mySnackbarBackgroundColor</item>
</style>

và cung cấp màu sắc của bạn trong values/colors.xmltệp của bạn

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="myColorPrimary">#008577</color>
    <color name="myColorPrimaryDark">#00574B</color>
    <color name="myColorAccent">#D81B60</color>
    <color name="mySnackbarBackgroundColor">#D81B60</color>
</resources>

CẬP NHẬT 2020

Vì giải pháp ở trên loại bỏ góc tròn của phụ trợ trình ăn nhanh, việc thiết lập nền theo cách này sử dụng thiết kế thanh ăn nhanh kế thừa, nếu bạn muốn giữ nguyên thiết kế material design, bạn có thể.

  1. Nếu bạn đang nhắm mục tiêu API 21+

thay thế android:backgroundbằngandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. Nếu bạn đang nhắm mục tiêu API <21 thì nếu bạn quyết định sử dụng thanh nhanh kế thừa cho API <21, bạn có thể đặt abouve của mình MySnackbarStyletrong thư mục res / values-21 / và để lại kiểu cũ - kế thừa trong thư mục res / values .

  2. Nếu bạn đang nhắm mục tiêu API <21 và bạn muốn có kiểu material của thanh snack cũng ở các cấp API thấp hơn này, bạn có thể thay đổi kiểu của snackbar theo res / values ​​/ theo cách này:

<!-- snackbar style in res/values/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:background">@drawable/my_snackbar_background</item>
</style>

và mượn của bạn my_snackbar_backgroundtừ repo chính thức , theo cách này:

<!-- in res/drawable/ -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="4dp"/>
    <solid android:color="@color/mySnackbarBackgroundColor"/>
</shape>

Đây là một repo sân chơi .

nhập mô tả hình ảnh ở đây


3
Đây là giải pháp sạch nhất và tốt nhất
TrackDave

Nó thay đổi kích thước của thanh snakbar
William

Lưu ý rằng AppTheme của bạn phải kế thừa từ Theme.MaterialComponents để biên dịch
A.Mamode

Cảm ơn vì my_snackbar_background. Không có nó, Snackbar đã vẽ với các góc tròn hơn.
CoolMind

Tôi đã thêm một chút kiểu dáng trong stackoverflow.com/a/62006413/2914140 .
CoolMind

15

Phiên bản Kotlin (có phần mở rộng ):

Tạo trong tệp (cho exemple SnackbarExtension.kt) một phần mở rộng:

fun Snackbar.withColor(@ColorInt colorInt: Int): Snackbar{
   this.view.setBackgroundColor(colorInt)
   return this
}

Tiếp theo, trong Activity / Fragment, bạn có thể thực hiện việc này:

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()

Thực sự thích câu trả lời này, tôi cũng đã thêm màu văn bản: fun Snackbar.withColor (@ColorInt backgroundColor: Int, @ColorInt textColor: Int): Snackbar {this.view.setBackgroundColor (backgroundColor) this.view.findViewById <TextView> ( android.support.design.R.id.snackbar_text) .setTextColor (textColor) trả lại cái này}
willcwf

13

Mã dưới đây hữu ích để thay đổi màu văn bản của tin nhắn.

Snackbar snackbar = Snackbar.make(rootView, "Enter Your Message",Snackbar.LENGTH_SHORT);
View view = snackbar.getView();
TextView tv = (TextView)view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.RED);
snackbar.show();

Cách thứ hai: Bạn cũng có thể thay đổi màu sắc bằng cách thay đổi chủ đề của hoạt động.


7

Đã quá muộn nhưng Đề phòng ai đó vẫn cần giúp đỡ. Đây là giải pháp làm việc.

      Snackbar snackbar = Snackbar.make(mainView, text, Snackbar.LENGTH_LONG);
    View snackBarView = snackbar.getView();
    snackBarView.setBackgroundColor(context.getResources().getColor(R.color.btn_background_color));
    snackbar.show();

4

Trong khi làm việc với xamarin android, tôi phát hiện ra rằng ContextCompat.GetColor () trả về Int nhưng setBackgroundColor () yêu cầu Tham số kiểu Màu. Vì vậy, đây là cách tôi làm cho nó hoạt động trong dự án android xamarin của tôi.

Snackbar snackbarview =  Snackbar.Make(toolbar, message, Snackbar.LengthLong);
View snckView = snackbarview.View;                
snckView.SetBackgroundColor(Color.ParseColor(GetString(Resource.Color.colorPrimary)));
snackbarview.Show();

+1 cho Xamarin View snckView = snackbarview.View;thay vì snackbar.getView();không có sẵn nhưng ParseColorkhông hoạt động.
Cfun

@Cfun Bạn có thể giải thích vấn đề của mình thêm một chút để tôi có thể giúp bạn với.
SATYAJEET RANJAN

Xấu của tôi tôi đã sử dụng System.Drawing.Color.ParseColorthay vì Android.Graphics.Color.ParseColor. bây giờ tôi có: "tên 'getstring' không tồn tại trong ngữ cảnh hiện tại"
Cfun

@Cfun Bạn có gặp lỗi này trong một hoạt động hoặc một phân đoạn hay bạn đang gọi getString () trong một số lớp khác không?
SATYAJEET RANJAN

Tôi đang gọi nó trong một số Class khác.
Cfun


2

Tôi đã tạo một lớp utils nhỏ để tôi có thể dễ dàng tạo ra các loại bánh snack có màu tùy chỉnh thông qua ứng dụng.

package com.yourapppackage.yourapp;

import android.support.design.widget.Snackbar;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class SnackbarUtils {

    private int BACKGROUND_COLOR;
    private int TEXT_COLOR;
    private int BUTTON_COLOR;
    private String TEXT;


    public SnackbarUtils(String aText, int aBgColor, int aTextColor, int aButtonColor){
        this.TEXT = aText;
        this.BACKGROUND_COLOR = aBgColor;
        this.TEXT_COLOR = aTextColor;
        this.BUTTON_COLOR = aButtonColor;
    }

    public Snackbar snackieBar(){
        Snackbar snackie = Snackbar.make(MainActivity.getInstance().findViewById(android.R.id.content), TEXT, Snackbar.LENGTH_LONG);
        View snackView = snackie.getView();
        TextView snackViewText = (TextView) snackView.findViewById(android.support.design.R.id.snackbar_text);
        Button snackViewButton = (Button) snackView.findViewById(android.support.design.R.id.snackbar_action);
        snackView.setBackgroundColor(BACKGROUND_COLOR);
        snackViewText.setTextColor(TEXT_COLOR);
        snackViewButton.setTextColor(BUTTON_COLOR);
        return snackie;
    }
}

sau đó để sử dụng nó, như thế này bất kỳ nơi nào trong ứng dụng:

new SnackbarUtils("This is the text displayed", Color.RED, Color.BLACK, Color.YELLOW).snackieBar().setAction("OTAY", v -> { 
     //donothing
     }).show();

2

Đặt nó trong một lớp Tiện ích:

public class Utility {
    public static void showSnackBar(Context context, View view, String text) {
        Snackbar sb = Snackbar.make(view, text, Snackbar.LENGTH_SHORT);
        sb.getView().setBackgroundColor(ContextCompat.getColor(context, R.color.colorAccent));
        sb.show();
    }
}

Sử dụng như thế này:

Utility.showSnackBar(getApplicationContext(), findViewById(android.R.id.content), "Add success!!!");

2

Về cơ bản, các giải pháp được cung cấp có một nhược điểm. Họ thay đổi hình dạng của thanh ăn nhanh và loại bỏ bán kính.

Cá nhân tôi, thích một cái gì đó như vậy

val snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
val view = snackbar.getView();
val color = view.resources.getColor(colorId)
view.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)

1

Không có giải pháp nào khác thực sự hiệu quả với tôi. Nếu tôi chỉ đặt màu nền của Snackbar, thì bố cục trong TextView và Nút có màu mặc định. Nếu tôi đặt nền của TextView, nó sẽ nhấp nháy một chút sau khi SnackBar được hiển thị. Và bố cục xung quanh nút vẫn ở màu mặc định.

Cuối cùng, tôi phát hiện ra rằng cách tốt nhất cho tôi là thay đổi màu nền của TextView gốc (SnackbarContentLayout). Bây giờ toàn bộ Snackbar được tô màu đúng cách và nó không nhấp nháy khi hiển thị.

snack = Snackbar.make(view, text, duration)
View view = snack.getView();
view.setBackgroundColor(BACKGROUND_COLOR);
TextView tv = view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(TEXT_COLOR);
((SnackbarContentLayout) tv.getParent()).setBackgroundColor(BACKGROUND_COLOR);

1

setBackgroundResource() hoạt động tốt.

Snackbar snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundResource(R.color.background);
snackbar.show();

1

Tôi không biết tại sao setBackgroundColor () không tìm thấy trong dự án của tôi. Đó là lý do tại sao tôi tạo một chức năng mở rộng và bây giờ nó ổn.

fun View.showSnackBar(message: String) {
    val snackBar = Snackbar.make(this, message, Snackbar.LENGTH_LONG)
    snackBar.setBackgroundTint(ContextCompat.getColor(this.context, R.color.colorAccent))
    snackBar.show()
}

và gọi nó như dưới đây

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/login_holder_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   // your UI

</FrameLayout>

LoginActivity.kt

login_holder_layout.showSnackBar("Invalid Email") 

0
public class CustomBar {

public static void show(View view, String message, boolean isLong) {
    Snackbar s = Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
    s.getView().setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red_900));
    s.show();
}

public static void show(View view, @StringRes int message, boolean isLong) {
    Snackbar s = Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
    s.getView().setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red_900));
    s.show();
}

}

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.