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で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>
ダイアログの背景色を白に設定していますが、背景色をスナックバーに設定することでオーバーライドする必要があります。
背景色を次のように設定してみてください。
sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
100%動作します!
このようにできます
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();
すべてのスナックバーの背景色を定義する場合は、リソースのどこかでdesign_snackbar_background_color
値をオーバーライドします。例えば:
<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>
メッセージのテキストの色を変更するには、ベローコードが便利です。
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();
第二の方法:アクティビティのテーマも変更することで色を変更できます。
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()
遅すぎますが、誰かがまだ助けが必要な場合に備えて。これが実用的なソリューションです。
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();
他の回答のいずれもカスタムスタイルのオーバーライドを提供していなかったので(私はそれを行うためのより安全な更新方法の1つと考えています)、ここに私のソリューションを投稿します。
新しい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 -->
<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>
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();
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!!!");
アプリを介してカスタム色のスナックバーを簡単に作成できるように、小さな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();
他の解決策はどれも私にとってはうまくいきませんでした。 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);
基本的に、提供されたソリューションには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)
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();
}
}
setBackgroundResource()
も同様に機能します。
Snackbar snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundResource(R.color.background);
snackbar.show();