如何像 material 文档中那样创建 Snackbar?

How to create a Snackbar like in the material documentation?

我在 Android 应用程序的 Outlook 中看到了这个新的 Snackbar 样式,现在在 Material 文档中寻找它:

https://material.io/design/components/snackbars.html

有人知道如何创建这些 "offset Snackbars" 吗?

how to create those "offset Snackbars"?

你可以获取SnackBar的LayoutParams并在其上添加BottomSidemargin

试试下面的代码

public static void showSnackbar(Snackbar snackbar, int sideMargin, int marginBottom) {
    final View snackBarView = snackbar.getView();
    // Depend upon your parent Layout Use `LayoutParams` of that Layout
    final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) snackBarView.getLayoutParams();

    params.setMargins(params.leftMargin + sideMargin,
                params.topMargin,
                params.rightMargin + sideMargin,
                params.bottomMargin + marginBottom);

    snackBarView.setLayoutParams(params);
    snackbar.show();
}

要构建像 Material:

这样的圆形 SnackBar,只需要做三件事
  1. 获取SnackBar的LayoutParams并设置边距
  2. 创建圆角形状
  3. 将圆角形状设置为 SnackBar 的背景

完整代码如下:

Snackbar.make(
            findViewById(R.id.coordinator_layout),
            "Your text here",
            Snackbar.LENGTH_SHORT
        ).apply {
            view.layoutParams = (view.layoutParams as CoordinatorLayout.LayoutParams).apply {
                setMargins(
                    12,
                    12,
                    12,
                    12
                )
            }
            view.background = resources.getDrawable(R.drawable.round_corner, null)
        }.show()

这里是 drawable/round_corner 中可绘制圆角的代码:

  <shape android:shape="rectangle"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#323232"/>
    <corners android:radius="4dp"/>
</shape>

您需要使用新的 Material 主题。 在您的 build.gradle 导入
implementation 'com.google.android.material:material:1.2.0-alpha06'

将所有 Snackbar 导入更改为:

import com.google.android.material.snackbar.Snackbar

然后在您的 style.xml 文件中,您的父主题需要是 material 主题之一:

Theme.MaterialComponents.Light.DarkActionBar

Theme.MaterialComponents.DayNight.NoActionBar

我添加了 https://material.io/develop/android/components/snackbars/

中的那些样式
<style name="Theme.App" parent="Theme.MaterialComponents.*">
    ...
    <item name="snackbarStyle">@style/Widget.App.Snackbar</item>
    <item name="snackbarButtonStyle">@style/Widget.App.SnackbarButton</item>
</style>

<style name="Widget.App.Snackbar" parent="Widget.MaterialComponents.Snackbar">
    <item name="materialThemeOverlay">@style/ThemeOverlay.App.Snackbar</item>
    <item name="actionTextColorAlpha">1</item>
  </style>

<style name="Widget.App.SnackbarButton" parent="Widget.MaterialComponents.Button.TextButton.Snackbar">
    <item name="android:textColor">@color/shrine_pink_100</item>
</style>

<style name="ThemeOverlay.App.Snackbar" parent="">
    <item name="colorPrimary">@color/shrine_pink_100</item>
    <item name="colorOnSurface">@color/shrine_pink_900</item>
</style>

而且有效!以编程方式修改 code/layout/background 对我不起作用

您可以只使用 Material 组件库中的默认值 Snackbar

如果您想更改 Snackbar 的边距,您可以在您的应用主题中添加 snackbarStyle 属性:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
    <item name="snackbarStyle">@style/MySnackbar</item>
</style>

与:

<style name="MySnackbar" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:layout_margin">32dp</item>
</style>