Как изменить цвет фона закусочной?


101

Я показываю снэк-бар в DialogFragment при положительном нажатии на alertDialog. Вот мой фрагмент кода.

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

Как вы можете видеть, цвет фона моих закусок отображается белым цветом

Я передаю просмотр фрагмента диалога на панель закусок. Я хочу черный цвет фона? Как я могу это сделать? Я возвращаю alertDialog в DialogFragment. И тема, которую я устанавливаю для диалога, следующая

<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>

Хотя я устанавливаю белый цвет фона для диалога, он должен переопределить, установив цвет фона для закусочной.



пробовал это уже не помогло мне ... я вызываю снек-бар из фрагмента диалога + alertDialog в нем, и я передаю положительный просмотр щелчка кнопки на снэк-бар
Ajinkya 01

Ответы:


172

Попробуйте установить цвет фона следующим образом:

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

Будет работать на все 100%!


50
вам может понадобиться сделатьsnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95 06

2
Если вы обнаружили на этой странице от Google и выше решение не работать для вас, вы , возможно , придется попробовать это вместо того, чтобы :sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
ПБУ

@modu Обратите внимание, что getResources#getColorон устарел с уровня API 23 (Marshmallow) и ContextCompat#getColorдолжен использоваться вместо него.
Эдрик

89

ты можешь сделать это вот так

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
как вы можете видеть, я сделал то же самое, но он не отображается черным цветом
Ajinkya 01

Я использую то же самое в одном из моих проектов, попытаюсь отобразить его в действии для тестирования, возможно, он не работает из-за диалога
Зубаир Акбер

Я работаю над активностью, но я хочу, чтобы это было во фрагменте диалога.
Ajinkya 01

Я думаю, что вы переходите к нему из-за вашего взгляда
Зубаир Акбер

20

Если вы хотите определить цвет фона для всех ваших Snackbar, просто переопределите design_snackbar_background_colorзначение где-нибудь в ваших ресурсах. Например:

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

Это самое чистое и красивое решение. Спасибо!
AloDev

1
Отлично работает, просто вставьте это в файл colors.xml, и все готово!
Ави Паршан

Нет. У меня не сработало. Ни одно из других решений.
AndroidDev

20

Поскольку ни в одном из других ответов не было переопределения пользовательского стиля (что я считаю одним из самых безопасных способов обновления для этого), я публикую здесь свое решение.

Я публикую решение, которое уже касается темы new AndroidX( support design 28).

При условии, что ваше приложение использует настраиваемые им, которые называются MyAppThemeв вашем 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">

Создайте (если вы еще этого не сделали) values/style.xmlфайл, заменяющий тему, используемую вашим приложением:

<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>

и укажите свои цвета в своем values/colors.xmlфайле

<?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>

ОБНОВЛЕНИЕ 2020

Поскольку в приведенном выше решении убирается круглый угол закусочной, так как при установке фона таким образом используется устаревший дизайн закусочной, если вы хотите сохранить материальный дизайн, вы можете.

  1. Если вы ориентируетесь на API 21+

заменить android:backgroundнаandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. Если вы ориентируетесь на API <21, тогда, если вы решите использовать устаревшую панель закусок для API <21, вы можете установить свой abouve MySnackbarStyleв папке res / values-21 / и оставить предыдущий - устаревший - стиль в папке res / values .

  2. Если вы ориентируетесь на API <21 и хотите иметь стиль материала закусочной панели также на этих более низких уровнях API, вы можете изменить стиль закусочной панели в своем res / values ​​/ следующим образом:

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

и заимствуйте свой my_snackbar_backgroundиз официального репо следующим образом:

<!-- 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>

Вот репо на детской площадке .

введите описание изображения здесь


3
Это самое чистое и лучшее решение
TrackDave

Это изменение размера Snakbar
Уильям

Обратите внимание, что ваша AppTheme должна быть унаследована от Theme.MaterialComponents для компиляции
A.Mamode,

Спасибо за my_snackbar_background. Без него Snackbar получился с более закругленными углами.
CoolMind

Я добавил немного больше стиля в stackoverflow.com/a/62006413/2914140 .
CoolMind

15

Версия Kotlin (с расширением ):

Создайте в файле (например, SnackbarExtension.kt) расширение:

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

Затем в своем Activity / Fragment вы сможете сделать это:

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

На самом деле, как этот ответ, я также добавил раскраску текста: 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) return this}
willcwf

13

Нижний код полезен для изменения цвета текста сообщения.

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

Второй способ: вы можете изменить цвет, также изменив тему деятельности.


7

Слишком поздно, но на случай, если кому-то все еще понадобится помощь. Вот рабочее решение.

      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

Работая с xamarin android, я обнаружил, что ContextCompat.GetColor () возвращает Int, но setBackgroundColor () ожидает параметр типа Color. Итак, вот как я заставил его работать в моем проекте xamarin android.

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

+1 для Xamarin, View snckView = snackbarview.View;вместо snackbar.getView();которого недоступен, но ParseColorне работает.
Cfun

@Cfun Не могли бы вы подробнее объяснить вашу проблему, чтобы я мог вам помочь.
SATYAJEET RANJAN

Мой плохой я использовал System.Drawing.Color.ParseColorвместо Android.Graphics.Color.ParseColor. теперь у меня есть: «имя getstring не существует в текущем контексте»
Cfun

@Cfun Вы получаете эту ошибку в действии или фрагменте или вызываете getString () в каком-то другом классе?
САТЬЯДЖИТ РАНДЖАН,

Я называю это каким-то другим Классом.
Cfun


2

Я сделал небольшой класс утилит, чтобы я мог легко создавать собственные цветные закуски прямо из приложения.

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

затем использовать его, например, в любом месте приложения:

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

2

Поместите его в служебный класс:

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

Используя вот так:

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

2

В принципе, предложенные решения имеют один недостаток. Они меняют форму закусочной и убирают радиус.

Лично предпочитаю что-то подобное

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

Ни одно другое решение не помогло мне. Если я установил только цвет фона Snackbar, макет в TextView и Button был в цвете по умолчанию. Если я установил фон TextView, он немного мигал после отображения SnackBar. А расположение вокруг кнопки все еще было в цвете по умолчанию.

В конце я обнаружил, что лучший способ для меня - изменить цвет фона родительского элемента TextView (SnackbarContentLayout). Теперь вся Snackbar правильно окрашена и не мигает, когда появляется.

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() работает так же хорошо.

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

1

Я не знаю, почему setBackgroundColor () не нашел в моем проекте. Вот почему я создал функцию расширения, и теперь все в порядке.

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

и назовите это как ниже

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

}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.