Style SnackBar in theme app
With the Material Components Library you can globally change the snackbar style in your app theme:
<style name="AppTheme" parent="Theme.MaterialComponents.*"> <!-- Style to use for Snackbars in this theme. --> <item name="snackbarStyle">@style/Widget.MaterialComponents.Snackbar</item> <!-- Style to use for action button within a Snackbar in this theme. --> <item name="snackbarButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Snackbar</item> <!-- Style to use for message text within a Snackbar in this theme. --> <item name="snackbarTextViewStyle">@style/Widget.MaterialComponents.Snackbar.TextView</item> ....</style>
Note:
snackbarStyle
andsnackbarButtonStyle
require the version1.1.0
snackbarTextViewStyle
requires the version1.2.0
.
For example:
<style name="snackbar_style" parent="@style/Widget.MaterialComponents.Snackbar"> <item name="android:layout_margin">32dp</item> </style> <style name="snackbar_button" parent="@style/Widget.MaterialComponents.Button.TextButton.Snackbar"> <item name="backgroundTint">@color/secondaryLightColor</item> <item name="android:textColor">@color/primaryDarkColor</item> </style> <style name="snackbar_text" parent="@style/Widget.MaterialComponents.Snackbar.TextView"> <item name="android:textColor">@color/secondaryLightColor</item> </style>
It is just an example how to change also the parent style for the action button. You can use for example a standard Widget.MaterialComponents.Button
:
<style name="snackbar_button" parent="@style/Widget.MaterialComponents.Button"> <item name="backgroundTint">@color/secondaryLightColor</item> <item name="android:textColor">@color/primaryDarkColor</item> </style>
To change the background color of the SnackBar
you can use:
<style name="snackbar_style" parent="@style/Widget.MaterialComponents.Snackbar"> <!-- using backgroundTint the alpha layer is ignored --> <item name="backgroundTint">@color/....</item></style>
Or if you prefer:
<style name="MySnackbar" parent="@style/Widget.MaterialComponents.Snackbar"> <item name="materialThemeOverlay">@style/snackbar_overlay</item> <!-- If you want to avoid the alpha level for the color that is overlaid on top of the background color--> <item name="backgroundOverlayColorAlpha">1.0</item> </style> <style name="snackbar_overlay"> <item name="colorOnSurface">....</item> </style>
you need this: tools:override="true"
<resources xmlns:tools="http://schemas.android.com/tools"> <style name="TextAppearance.Design.Snackbar.Message" parent="android:TextAppearance" tools:override="true"> <item name="android:textColor">@color/text</item> <item name="android:textSize">50sp</item> </style></resources>
Refer to this link for more information:
// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);
// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));
// get snackbar view
View snackbarView = snackbar.getView();
// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);textView.setTextColor(getResources().getColor(R.color.indigo));
// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);