如何更改点心栏的背景颜色?

我在警告对话框的正面触摸中显示了 DialogFragment中的 snackbar。下面是我的代码片段:

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

As you can see my snackbars background color is showing white color

我正在将 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>

虽然我将对话框的背景颜色设置为白色,但是它应该通过将背景颜色设置为 零食吧来覆盖。

97823 次浏览

你可以这样做

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

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

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

100% 有效!

Bellow code is useful for change the text color of message.

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

第二种方法: 你也可以通过改变活动的主题来改变颜色。

I made a little utils class so I can easily make custom colored snackbars thru out the app.

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

把它放在工具类中:

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

}

为时已晚,但万一有人仍然需要帮助。以下是可行的解决方案。

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

如果要为所有 Snackbar 定义背景颜色,只需覆盖资源中的某个位置的 design_snackbar_background_color值。例如:

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

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

在使用 Xamarin 机器人时,我发现 ContextCompat。GetColor ()返回 Int,但 setBackoundColor ()需要 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();

其他的解决方案对我来说都不管用。如果我只设置 Snackbar 的背景颜色,那么 TextView 和 Button 下的布局是默认颜色。如果我设置 TextView 的背景,它会在 SnackBar 显示后闪烁一下。按钮周围的布局仍然是默认颜色。

最后我发现对我来说最好的方法就是改变 TextView 父节点的背景颜色(SnackbarContentLayout)。现在整个点心条的颜色正确,它不会眨眼当它显示。

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

由于没有其他答案提供自定义样式覆盖(我认为这是最安全的更新方式之一) ,我在这里张贴我的解决方案。

我发布了一个解决方案,已经解决了新的 AndroidX(support design 28)主题。

假设你的应用程序在你的 AndroidManifest.xml中使用一个自定义的 MyAppTheme:

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

replace android:background with 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的遗留快餐栏,您可以在 Res/value-21/文件夹中设置大约 MySnackbarStyle,并在 参数/值文件夹中保留以前的遗留样式。

  2. 如果你的目标是 API < 21,并且你想在这个较低的 API 级别上拥有快餐条的材质风格,你可以在你的 Res/value/中以这种方式改变你的快餐条风格:

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

and borrow your my_snackbar_background from the 官方回购, this way:

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

EDIT 2022:

如果你只想改变一个点心栏,而不是整个应用程序,那么你可以使用 ContextThemeWrapper 如下;

ContextThemeWrapper ctw = new ContextThemeWrapper(this, R.style.CustomSnackbarTheme);
customSnackBar = Snackbar.make(ctw, view, "", Snackbar.LENGTH_LONG);

和你的风格文件

<style name="CustomSnackbarTheme">
<item name="snackbarStyle">@style/MySnackBarStyle</item>
</style>


<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
<item name="android:background">@android:color/red</item>
</style>

这是 游乐场回购

enter image description here

setBackgroundResource()也能正常工作。

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

基本上,所提供的解决方案有一个缺点。 They change the shape of snackbar and remove the radius.

我个人比较喜欢这样

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

对于 材料组件库 ,只需使用 强 > setBackgroundTint方法。

    Snackbar snackbar = Snackbar.make(view, "Snackbar custom style", Snackbar.LENGTH_LONG);
snackbar.setBackgroundTint(ContextCompat.getColor(this,R.color.secondaryColor));
snackbar.show();

enter image description here


使用 喷气背包构图,您可以定制定义自定义 Snackbar强 > SnackbarHost

    snackbarHost = {
// reuse default SnackbarHost to have default animation and timing handling
SnackbarHost(it) { data ->
Snackbar(
snackbarData = data,
backgroundColor = Color.Red
)
}
},

那就用吧:

scope.launch {scaffoldState.snackbarHostState.showSnackbar("Snackbar text")}

enter image description here

我不知道为什么 setBackoundColor ()在我的项目中没有找到。这就是为什么我创建了一个扩展函数,现在已经没事了。

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

您可以在材料设计库中使用此代码

你可以用这个方法

创建颜色代码

open the res/values/colors.xml and add this line

<resources>
<color name="custom_color_name">CustomCode</color>
</resources>

创建 Snackbar 并更改背景

open your activity or fragment and create Snackber

Snackbar snackbar= Snackbar.make(root,R.string.imageUploadTitle_error, BaseTransientBottomBar.LENGTH_LONG);

get Snackbar View

现在你应该得到 SnackbarView 并在其中更改自定义背景

View snackview = snackbar.getView();

改变背景颜色

用这个函数设置小吃栏的背景颜色

snackview.setBackgroundColor(ContextCompat.getColor(getActivity() , R.color.error));

展示这个小吃吧

现在应该显示点心吧

snackbar.show();

so you can see changed background to custom color

对科特林来说:

Snackbar.make(view,"simple text",Snackbar.LENGTH_SHORT).setBackgroundTint(Color.RED).show()

使用 Java 的旧格式

mySnackbar.setBackgroundColor(ContextCompat.getColor(getActivity(), android.R.color.black));

Actualy format using kt

mySnackbar.setBackgroundTint(ContextCompat.getColor(applicationContext, android.R.color.black));