如何更改小吃店的背景颜色?


101

我在alertDialog的正面单击中的DialogFragment中显示小吃栏。这是我的代码段。

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

如您所见,我的小吃店背景色显示为白色

我正在将dialogfragment的视图传递给小吃店。我想要背景颜色黑色吗?我怎样才能做到这一点?我在DialogFragment中返回alertDialog。我设置对话框的主题如下

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

Answers:


170

尝试像这样设置背景颜色:

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

它将100%工作!


50
您可能需要做snackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95'5

2
如果您发现来自Google的此页面且以上解决方案不适合您,则您可能需要尝试以下方法:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
modu

@modu请注意,getResources#getColor自API级别23(棉花糖)以来已弃用,ContextCompat#getColor应改为使用。
Edric '18

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

我在我的一个项目中使用了相同的代码,尝试在活动中进行显示以进行测试,可能由于对话而无法正常工作
Zubair Akber 2015年

雅其工作的活动,但我希望它在对话框片段上。
Ajinkya 2015年

我认为是因为您的观点而将您传递给它
Zubair Akber

20

如果要为所有小吃栏定义背景色,只需design_snackbar_background_color在资源中的某个位置覆盖该值即可。例如:

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

这个解决方案是最干净,最漂亮的。谢谢!
AloDev '18 -10-10

1
效果很好,只需将其粘贴在colors.xml中就可以了!
阿维·帕山

不。没为我工作。其他解决方案也没有。
AndroidDev

20

由于没有其他答案提供自定义样式覆盖(我认为这样做是最安全的更新方式之一),因此我在此处发布了解决方案。

我发布了一个已经解决了新AndroidXsupport 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:backgroundandroid: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 MySnackbarStyleRES /值-21 /文件夹,并保留以前的-传统-风格在你的RES /值文件夹中。

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

它改变了保险柜的大小
威廉

请注意,您的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
}

接下来,在“活动/片段”中,您可以执行以下操作:

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类型的Parameter。所以这就是我如何在我的xamarin android项目中使用它。

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

Xamarin的+1(View snckView = snackbarview.View;而不是+1 snackbar.getView();)不可用,但ParseColor不起作用。
Cfun

@Cfun您能再解释一下您的问题,以便我为您解决吗。
SATYAJEET RANJAN

我的坏我用System.Drawing.Color.ParseColor代替Android.Graphics.Color.ParseColor。现在我有了:“名称'getstring'在当前上下文中不存在”
Cfun

@Cfun是在活动或片段中收到此错误,还是在其他某个类中调用getString()?
SATYAJEET RANJAN

我在其他班级称呼它。
Cfun


2

我做了一些utils课,所以我可以轻松地通过应用程序制作自定义的彩色小吃吧。

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

将其放在Utility类中:

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

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.