将边距添加到Snackbar视图

And*_*ast 7 android android-layout android-snackbar

我正在更新我当前的应用程序以使用零食栏,在Google规范中它们显示了各种使用它们的方法http://www.google.com/design/spec/components/snackbars-toasts.html#snackbars-toasts-specs

例A:

有保证金的小吃吧

例B:

Snackbar固定在布局上

这是我的代码atm:

Snackbar snackbar = Snackbar.make(mParentLayout, displayMessage,     
    Snackbar.LENGTH_LONG);
    snackbar.setAction(actionMessage, mClickListener);
    snackbar.show();
Run Code Online (Sandbox Code Playgroud)

我在例B中得到了结果,

我该如何添加保证金?

Bam*_*amx 23

比Saeid的答案更好,您可以获得默认的SnackBar布局参数并根据需要进行修改:

public static void displaySnackBarWithBottomMargin(Snackbar snackbar, int sideMargin, int marginBottom) {
    final View snackBarView = snackbar.getView();
    final CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) snackBarView.getLayoutParams();

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

    snackBarView.setLayoutParams(params);
    snackbar.show();
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.只是一个小建议是使用`final ViewGroup.MarginLayoutParams params =(ViewGroup.MarginLayoutParams)snackBarView.getLayoutParams();`这将使代码更加通用,因为它适用于大多数布局. (9认同)
  • 这段代码对我不起作用,只需添加黑色边距 (3认同)

M.U*_*man 15

以上解决方案都不适合我。

但是,我得到了一个技巧,我们可以在翻译的帮助下使用它。

Snackbar snackbar = Snackbar.make(mActivity.getWindow().getDecorView().getRootView(), message, Snackbar.LENGTH_SHORT);
View snackBarView = snackbar.getView();
snackBarView.setTranslationY(-(convertDpToPixel(48, mActivity)));
snackbar.show();
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到 convertDpToPixel 方法

  • 不幸的是,在我的情况下,snackbar.getView().setTranslationY()不执行任何操作,而snackbar.getView().setTranslationX()按预期工作。 (2认同)

Vod*_*det 8

我只是添加我的解决方案,因为@BamsMamx 解决方案不起作用我需要添加 getChildAt(0)

  public static void displaySnackBarWithBottomMargin(BaseActivity activity, View main) {
   Snackbar snackbar = Snackbar.make(main, R.string.register_contacts_snackbar, Snackbar.LENGTH_SHORT);
    final FrameLayout snackBarView = (FrameLayout) snackbar.getView();

    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) snackBarView.getChildAt(0).getLayoutParams();
    params.setMargins(params.leftMargin,
                params.topMargin,
                params.rightMargin,
                params.bottomMargin + 100;
    snackBarView.getChildAt(0).setLayoutParams(params);
    snackbar.show();
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 8

借助 Material Components 库,您可以snackbarStyle在应用主题中使用该属性:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
    <item name="snackbarStyle">@style/MySnackbar</item>
</style>
Run Code Online (Sandbox Code Playgroud)

和:

<style name="MySnackbar" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:layout_margin">32dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • layout_marginStart、layout_marginLeft、layout_marginHorizo​​ntal 等不起作用。看来只有layout_margin 起作用。 (2认同)

小智 5

添加 CoordinatorLayout 或 Frame Layout 然后设置边距对我不起作用

要解决此问题,请使用 Drawable Background,其中使用 item 设置 Margin 和 shape 以设置所需的 Padding

container_snackbar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--    Set Margin Here -->
    <item
        android:left="20dp"
        android:right="20dp"
        android:bottom="10dp"
        android:top="10dp">

        <!-- Insert your shape here: -->
        <shape android:shape="rectangle"  >
            <solid android:color="#FE4C4C" />

            <!-- Padding for inner text-->
            <padding android:left="25dp" android:right="10dp" android:bottom="10dp" android:top="10dp" />
            <corners android:radius="5dp" />

        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

然后从 Activity 设置 Drawable

主活动.java

Snackbar snack = Snackbar
                 .make(activity,"Hello World ",Snackbar.LENGTH_INDEFINITE);
        snack.getView()
        .setBackground(ContextCompat.getDrawable(getApplicationContext(),R.drawable.contianer_snackbar));
        snack.show();
Run Code Online (Sandbox Code Playgroud)

结果


Bre*_*ntM 3

控制 Snackbar 显示的关键是使用android.support.design.widget.CoordinatorLayout布局。如果没有它,您的 Snackbar 将始终显示在小型设备的底部和大型设备的左下角。注意:您可以使用作为布局的CoordinatorLayout根或布局树结构中的任何位置。ViewGroup

添加后,确保将CoordinatorLayout(或子)作为 Snackbar.make() 命令的第一个参数传递。

通过添加填充或边距,CoordinatorLayout您可以控制位置并将 Snackbar 从屏幕底部移动。

材料设计指南指定了 Snackbar 的最小和最大宽度。在小型设备上,您会看到它填满屏幕的宽度,而在平板电脑上,您会看到 Snackbar 达到最大宽度,但不会填满屏幕的宽度。