如何在材料文档中创建 Snackbar?

Posted

技术标签:

【中文标题】如何在材料文档中创建 Snackbar?【英文标题】:How to create a Snackbar like in the material documentation? 【发布时间】:2018-12-26 16:09:47 【问题描述】:

我在 Outlook for android 应用程序中看到了这种新的 Snackbar 样式,现在在材料文档中寻找它:

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

有人知道如何创建那些“偏移 Snackbars”吗?

【问题讨论】:

【参考方案1】:

您可以只使用 Material Components Library 中的默认 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>

【讨论】:

【参考方案2】:

我从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>

它有效!以编程方式修改代码/布局/背景对我不起作用

【讨论】:

【参考方案3】:

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

将所有 Snackbar 导入更改为:

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

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

Theme.MaterialComponents.Light.DarkActionBar

Theme.MaterialComponents.DayNight.NoActionBar

【讨论】:

【参考方案4】:

构建一个像 Material 一样的圆形 SnackBar 只需要做三件事:

    获取SnackBar的LayoutParams并设置边距 创建圆角形状 设置圆角形状作为 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中圆角drawable的代码:

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

【讨论】:

【参考方案5】:

如何创建那些“偏移 Snackbars”?

你可以获取SnackBar的LayoutParams,并为其添加BottomSide边距

试试下面的代码

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

【讨论】:

谢谢,你也知道我怎么做那些圆角吗? 您也许可以使用创建圆角shape drawable 并将其设置为小吃店背景来做到这一点

以上是关于如何在材料文档中创建 Snackbar?的主要内容,如果未能解决你的问题,请参考以下文章

如何在angularjs材料设计中创建固定页脚

如何在 AngularJS 材料设计中创建简单的搜索输入文本?

如何使用角材料在具有可扩展行的表中创建嵌套垫表

在 Android 中,如何按照材料设计文档的规定创建一个概述的下拉菜单(微调器)? [关闭]

如何在 Flutter 中创建和使用 SnackBar 进行重用(全局)

如何在 C# 中创建相对于用户文档的文件目录?