Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将边距添加到Snackbar视图_Android_Android Layout_Android Snackbar_Snackbar - Fatal编程技术网

Android 将边距添加到Snackbar视图

Android 将边距添加到Snackbar视图,android,android-layout,android-snackbar,snackbar,Android,Android Layout,Android Snackbar,Snackbar,我正在更新我当前的应用程序以使用Snackbar,在Google规范中,它们显示了各种使用方式 示例A: 例B: 这是我的代码: Snackbar snackbar = Snackbar.make(mParentLayout, displayMessage, Snackbar.LENGTH_LONG); snackbar.setAction(actionMessage, mClickListener); snackbar.show(); 我得到例子B中的结

我正在更新我当前的应用程序以使用Snackbar,在Google规范中,它们显示了各种使用方式

示例A:

例B:

这是我的代码:

Snackbar snackbar = Snackbar.make(mParentLayout, displayMessage,     
    Snackbar.LENGTH_LONG);
    snackbar.setAction(actionMessage, mClickListener);
    snackbar.show();
我得到例子B中的结果


如何添加边距?

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

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

通过将填充或边距添加到
坐标布局
中,您可以控制位置并从屏幕底部移动Snackbar

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

尝试以下方法:

Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "message", Snackbar.LENGTH_LONG);

View snackBarView = snackbar.getView();
            LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,      
LayoutParams.WRAP_CONTENT);

params.setMargins(left, top, right, bottom);

snackBarView.setLayoutParams(params);

snackbar.show();

除了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();
}
这对我有用
容器
是协调布局的父标签
R.id.bottom\u条
是一个视图,上面的snackbar应该显示在该视图上

    Snackbar.make(container, getString(R.string.copied), Snackbar.LENGTH_LONG).apply {
        val params = view.layoutParams as CoordinatorLayout.LayoutParams
        params.anchorId = R.id.bottom_bar
        params.anchorGravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
        params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
        view.layoutParams = params
        show()
    }

如果您需要额外的边距,只需在
R.id.bottom\u栏中添加填充即可。这只起作用

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


对于kotlin开发人员,我使用的只是一些方便的扩展

inline fun View.snack(message:String, left:Int = 10, top:Int = 10, right:Int = 10, bottom:Int = 10, duration:Int = Snackbar.LENGTH_SHORT){
 Snackbar.make(this, message, duration).apply {

     val params = CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT )
     params.setMargins(left, top, right, bottom)
     params.gravity = Gravity.BOTTOM
     params.anchorGravity = Gravity.BOTTOM

     view.layoutParams = params
     show()
 }
}


inline fun View.longSnack(message:String){
   snack(message, duration = Snackbar.LENGTH_LONG)
}

我在Kotlin扩展中的解决方案: fun showSnackBarWithConfirmation(text: String, view: View, action: () -> Unit) = Snackbar.make(view, text, Snackbar.LENGTH_LONG).apply { this.view.findViewById(R.id.snackbar_text) .setTextColor(view.context.color(R.color.colorBackgroundLight)) this.view.setBackgroundResource(view.context.color(R.color.colorBackgroundLight))

        setAction(view.context.getString(R.string.common_ok)) { action.invoke() }

        (this.view.layoutParams as ViewGroup.MarginLayoutParams)
            .apply { setMargins(56,0,56,300) }

        show()
    }

如果您只想将余量应用于特定的一面,您还应按以下方式实现。 例如,仅应用底部边距

 Snackbar.make(yourContainerView, getString(R.string.your_snackbar_message), Snackbar.LENGTH_LONG_orWhateverYouWant).apply {
    val params = view.layoutParams as CoordinatorLayout.LayoutParams
    params.anchorId = R.id.your_anchor_id
    params.anchorGravity = Gravity.TOP_orWhateverYouWant
    params.gravity = Gravity.TOP_orWhateverYouWant
    params.bottomMargin = 20 // in pixels
    view.layoutParams = params
    show()
}

上述解决方案对我都不起作用

但是,我有一个技巧,我们可以在翻译的帮助下使用

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

您可以找到convertDpToPixel方法

只需将其添加到主题中:

<item name="snackbarStyle">@style/SnackbarMessageStyle</item>
@style/SnackbarMessageStyle
并添加样式:

<style name="SnackbarMessageStyle" parent="@style/Widget.MaterialComponents.Snackbar">
    <item name="android:layout_margin">@dimen/snackbarMessageMargin</item>
</style>

@dimen/SNACKBARMessage页边距
设置边距:

View viewInSnk = snkbr.getView();
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) snkbr.getView().getLayoutParams();
params.setMargins(5, 5, 5, 5);
snkbr.getView().setLayoutParams(params);
要设置圆角,请执行以下操作:

viewInSnk.setBackgroundDrawable(getResources().getDrawable(R.drawable.snackbar_shape));
至于形状:

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

就个人而言,没有一种建议的方法出现(Android 9)
我按照以下方式决定。
我在布局中添加了一个不可见的对象(锚定视图),并制作了:

snackbar.anchorView = anchor_view

上述解决方案对我都不起作用。这是我的解决方案,我的想法是用透明的一面创建背景,所以看起来像一个空白。试试这个对我有用:

  • 创建可绘制的背景

     <?xml version="1.0" encoding="utf-8"?>
     <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
         <item>
             <shape android:shape="rectangle">
                 <solid android:color="@color/transparent" />
             </shape>
         </item>
         <item android:top="16dp" android:bottom="16dp" android:left="16dp" android:right="16dp">
             <shape android:shape="rectangle">
                 <solid android:color="#323232" />
                 <corners android:radius="4dp" />
             </shape>
         </item>
     </layer-list>
    
  • 叫Snackbar make

     Snackbar.make(view, R.string.my_message, Snackbar.LENGTH_SHORT).show(this)
    

  • 就这些。告诉我这是否有效,谢谢…

    使用材质组件库,您可以在应用程序主题中使用
    snackbarStyle
    属性:

    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
        <item name="snackbarStyle">@style/MySnackbar</item>
    </style>
    
    
    @样式/mysnakbar
    
    与:

    
    32dp
    

    添加坐标布局或框架布局,然后设置边距对我不起作用

    要解决此问题,请使用Drawable Background,其中使用item设置边距和形状以设置所需的填充

    container\u 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>
    
    
    
    然后从活动中设置可绘制的

    MainActivity.java

    Snackbar snack = Snackbar
                     .make(activity,"Hello World It wasn't working for me programitly, so I did it from the styles.xml

    Create this style

     <style name="hpr_snackbar_message_style" parent="@style/Widget.MaterialComponents.Snackbar">
            <item name="android:layout_margin">@null</item>
            <!-- Use default Snackbar margins for top/left/right -->
            <item name="android:layout_marginTop">@dimen/mtrl_snackbar_margin</item>
            <item name="android:layout_marginLeft">@dimen/snackbar_margin</item>
            <item name="android:layout_marginRight">@dimen/snackbar_margin</item>
            <!-- Custom bottom margin, this could work for top/left/right too -->
            <item name="android:layout_marginBottom">@dimen/snackbar_margin</item>
        </style>
    
    Snackbar零食=Snackbar
    
    .make(activity),“Hello World它在程序上不适合我,所以我从styles.xml中执行了它

    创建此样式

     <style name="parent_theme" parent="Theme.AppCompat.Light">
            <item name="snackbarStyle">@style/hpr_snackbar_message_style</item>
    
    
    @空的
    @尺寸/长度\u蛇形条\u边距
    @尺寸/蛇形条/边缘
    @尺寸/蛇形条/边缘
    @尺寸/蛇形条/边缘
    
    将其添加到父主题中

    public  class SnackBar{  
    Context context;
    Snackbar getSnackbar(View v, String s, View.OnClickListener listener, String action){
        Snackbar sn = Snackbar.make(v, "" + s, Snackbar.LENGTH_LONG);
        sn.setAction("" + action, listener);
        sn.setActionTextColor(Color.CYAN);
        sn.show();
     sn.getView().setBackground(ContextCompat.getDrawable(context,R.drawable.snackbar_shape));
        return sn;
    }
    
    
    @样式/hpr\u snackbar\u消息\u样式
    
    其他答案对我不起作用。我已经实现了这一点:

    SnackBar.class

      // Snackbar.make(v,"Notification for pressing button",Snackbar.LENGTH_LONG).show();
                final SnackBar snackBar=new SnackBar();
               snackBar.context=MainActivity.this;
               snackBar.getSnackbar(v, "Notification for pressing ", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.e(TAG,"cancelled");
                        snackBar.onClick=true;
                        
                    }
                }, "cancel");
    
    在MainActivity.class中包括

    MainActivity.class:

    <item
        android:left="20dp"
        android:right="20dp"
        android:bottom="10dp"
        android:top="10dp">     
        <shape android:shape="rectangle"  >
            <solid android:color="#F31E1E1E" />    
            <padding android:left="25dp"android:right="25dp" android:bottom="10dp"android:top="10dp" />
            <corners android:radius="7dp" />
    
        </shape>
    </item>
    
    在可绘制目录中

    snackbar_shape.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>
    

    
    
    谢谢。一个小小的建议是使用final ViewGroup.MarginLayoutParams params=(ViewGroup.MarginLayoutParams)snackBarView.getLayoutParams()
    这将使代码更加通用,因为它适用于大多数布局。此代码不适用于我,只需添加一个黑色的边距即可color@FereshtehNaji你可以查看我的答案。它100%有效。这个答案看起来像是更干净的答案,但它不起作用。你必须在snackbar中放入一些东西才能加载它吗?它不起作用工作。在注意到这个答案之前,我已经尝试过了。不幸的是,snackbar.getView().setTranslationY()在snackbar.getView().setTranslationX()时没有做任何事情在我的情况下,效果与预期一致。谢谢。这是唯一一个在我的情况下有效的方法。我尝试了其他方法。右边距似乎不起作用,但下边距和左边距起作用。@BAMSAMX的解决方案是有效的,但目前你的版本是有效的:)我猜他们改变了Snackbar实现中的某些内容。如何以编程方式将此样式应用于Snackbar?默认情况下,它将应用于每个Snackbar,因为主题是主AppTheme,这是menifest中标记上的默认主题。
      // Snackbar.make(v,"Notification for pressing button",Snackbar.LENGTH_LONG).show();
                final SnackBar snackBar=new SnackBar();
               snackBar.context=MainActivity.this;
               snackBar.getSnackbar(v, "Notification for pressing ", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.e(TAG,"cancelled");
                        snackBar.onClick=true;
                        
                    }
                }, "cancel");
    
    <item
        android:left="20dp"
        android:right="20dp"
        android:bottom="10dp"
        android:top="10dp">     
        <shape android:shape="rectangle"  >
            <solid android:color="#F31E1E1E" />    
            <padding android:left="25dp"android:right="25dp" android:bottom="10dp"android:top="10dp" />
            <corners android:radius="7dp" />
    
        </shape>
    </item>