Style SnackBar in theme app

前端 未结 5 1646
深忆病人
深忆病人 2020-12-01 16:10

I need help. How can I change the design of the text in snackbar in styles app? The change in the code does not interest me. I found the following code. But it is not worki

相关标签:
5条回答
  • 2020-12-01 16:16

    I digged into Snackbar sources and here's what I found Snackbar background consists of 2 layers: base and overlay, which colors are mixing.

    In order to specify these colors, just add to your Theme 2 parameters:

    colorSurface - background color, default = 0xFFFFFFFF

    colorOnSurface - overlay, default = 0xFF000000

    So in a default case, with applied 0.8 alpha by default, a color we get is 0xFF333333, which is in a middle between white and black.

    Have fun mixing and styling your Snackbar :)

    0 讨论(0)
  • 2020-12-01 16:20

    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 and snackbarButtonStyle require the version 1.1.0
    • snackbarTextViewStyle requires the version 1.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>
    
    0 讨论(0)
  • 2020-12-01 16:20

    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);
    
    0 讨论(0)
  • 2020-12-01 16:25

    Thanks to shadowsheep I wrote these styles with Material Components. I also removed margins. You can compile his app to research Snackbar.

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    
        <!-- Snackbar -->
        <item name="snackbarStyle">@style/MaterialSnackbarTheme</item>
        <item name="snackbarButtonStyle">@style/MaterialSnackbarTextButtonTheme</item>
        <item name="snackbarTextViewStyle">@style/MaterialSnackbarTextViewTheme</item>
    </style>
    
    <style name="MaterialSnackbarTheme" parent="@style/Widget.MaterialComponents.Snackbar">
        <!-- <item name="backgroundTint">#00cc77</item>-->
        <!-- <item name="android:background">@drawable/snackbar_background</item>-->
        <item name="android:background">#00cc77</item>
        <item name="cornerRadius">0dp</item>
        <item name="android:layout_margin">0dp</item>
        <item name="actionTextColorAlpha">1.0</item>
    </style>
    
    <style name="MaterialSnackbarTextButtonTheme" parent="@style/Widget.MaterialComponents.Button.TextButton.Snackbar">
        <item name="backgroundTint">#7777ff</item>
        <item name="android:textColor">#ffffff</item>
    </style>
    
    <style name="MaterialSnackbarTextViewTheme" parent="@style/Widget.MaterialComponents.Snackbar.TextView">
        <item name="android:textColor">#ffffff</item>
        <item name="android:alpha">1.0</item>
    </style>
    

    Where drawable/snackbar_background.xml is:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle"
        >
        <solid android:color="#00cc77" />
    </shape>
    

    Don't forget to remove from Snackbar.make(), if you have added:

    view.setBackgroundColor(ContextCompat.getColor(context, R.color.bg_color))
    setActionTextColor(ContextCompat.getColor(context, R.color.button_color))
    

    Unlike AlertDialog, Snackbar holds snackbarButtonStyle and snackbarTextViewStyle settings inside AppTheme (that's strange because yesterday they worked well inside MaterialSnackbarTheme).

    As @StayCool said in comments, Snackbar currently uses transparency for background and text color (alpha = 0.5 - 0.6). Also they added round corners and margins. To remove background transparency, use either <item name="actionTextColorAlpha">1.0</item> or drawable/snackbar_background.xml. You can see his variant.

    0 讨论(0)
  • 2020-12-01 16:28

    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>
    
    0 讨论(0)
提交回复
热议问题