スナックバーの背景色を変更するには?


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

uは私のスナックバーの背景色が白い色を示しているのを見ることができます

ダイアログフラグメントのビューをスナックバーに渡します。背景色を黒にしたいですか?これどうやってするの?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

回答:


170

次のように背景色を設定してみてください:

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

@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
あなた

私は自分のプロジェクトの1つで同じものを使用しています。テストのためにそれをアクティビティに表示してみてください。ダイアログが原因で機能していない可能性があります
Zubair Akber

yaその活動に取り組んでいますが、私はそれを対話の断片にしたいです。
Ajinkya

私はあなたがそれに通っているというあなたの見解のせいだと思います
Zubair Akber

20

すべてのスナックバーの背景色を定義したい場合design_snackbar_background_colorは、リソースのどこかで値をオーバーライドしてください。例えば:

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

このソリューションは最もクリーンで優れています。ありがとう!
AloDev 2018年

1
うまく動作します。これをcolors.xmlに貼り付けるだけで準備完了です!
Avi Parshan 2018年

いいえ。私のために働いていませんでした。他のソリューションも実行しませんでした。
AndroidDev

20

他のどの回答もカスタムスタイルオーバーライドを提供しなかったので(私はそれを行うための最も安全な更新方法の1つと考えています)、ここに私の解決策を投稿します。

新しい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にレガシースナックバーを使用することを決定するとMySnackbarStyleres / values-21 /フォルダーにabouve を設定し、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
}

次に、アクティビティ/フラグメントで、これを行うことができます:

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

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

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

それをユーティリティクラスに入れます。

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

基本的に、提供されたソリューションには1つの欠点があります。彼らはスナックバーの形を変え、半径を削除します。

個人的には、そのようなものを好む

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

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.