Як змінити колір тла закусочної?


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 в ньому, і я передаю позитивний перегляд
клавіш на сноубар

Відповіді:


171

Спробуйте встановити такий колір фону:

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

Це спрацює на 100%!


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

2
Якщо ви виявили, що ця сторінка від Google і вищевказане рішення вам не sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
підійшло

@modu Примітка, що getResources#getColorзастаріла з рівня API 23 (Зефір) і 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
як ви бачите, я зробив точно те саме, але це не відображалося чорним кольором
Аджинкя

я використовував те ж саме в одному зі своїх проектів, спробуйте відобразити його в активності для тестування, можливо, він не працює через діалогове вікно
Zubair Akber

Я працюю над діяльністю, але я хочу це над фрагментом діалогу.
Ajinkya

я думаю, що саме через ваш погляд ви переходите до нього
Зубайр Акбер

20

Якщо ви хочете визначити колір тла для всіх своїх закусочних, просто перевизначте design_snackbar_background_colorзначення десь у ваших ресурсах. Наприклад:

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

Це рішення є найчистішим і приємним. Дякую!
AloDev

1
Чудово працює, просто вставте це у colors.xml, і все готово!
Аві Паршан,

Ні. Не працювало для мене. Як і жодне з інших рішень.
AndroidDev

20

Оскільки жодна з інших відповідей не передбачає заміни власного стилю (що я вважаю одним із найбезпечніших способів оновлення), я розміщую тут своє рішення.

Я публікую рішення, яке вже стосується нової 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 / і залишити попередній - legacy - стиль у вашому папці 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

Це змінює розмір закусочної
Вільям

Зверніть увагу, що ваша AppTheme повинна успадковувати від Theme.MaterialComponents для компіляції
A.Mamode

Дякую за my_snackbar_background. Без нього Снекбар малював із закругленими кутами.
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) повернути це}
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 () в якомусь іншому класі?
SATYAJEET RANJAN

Я називаю це в якомусь іншому класі.
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.