无法设置SnackBar底边距

时间:2019-05-18 13:12:42

标签: java android android-snackbar snackbar

按照this线程中给出的提示,我将快餐栏的底部边距设置为ca。 55 dp才能使其超过FAB。

代码是-另一个问题:

Snackbar snackbar = Snackbar.make(constraintLayoutContent, msg, Snackbar.LENGTH_LONG);
snackbar.setAction(action, v -> snackbar.dismiss());

View snackBarView = snackbar.getView();

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) snackBarView.getLayoutParams();

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

//params.gravity = Gravity.TOP;

snackBarView.setLayoutParams(params);

snackbar.show();

我面临的问题是,如果快餐栏位于屏幕的底部(params.gravity = Gravity.BOTTOM;),则不会应用底部边距;但是,如果将快餐栏放置在屏幕(params.gravity = Gravity.TOP; params.topMargin = 500;)的顶部,则正确应用了顶部边距。

该问题的两个屏幕截图:

top margin correctly applied

bottom margin not applied

感谢您的帮助。

编辑:

以下是我的布局xml文件。不知道这是否有帮助,但是我们在这里。

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/coordinatorLayoutContent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/constraintLayoutContent">

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

3 个答案:

答案 0 :(得分:1)

M.Usman version为我工作:

val snackBarView = snackbar.view
snackBarView.translationY = (-getNavigationBarSize(context)).toFloat()
snackbar.show()

@JvmStatic
fun getNavigationBarSize(context: Context): Int {
    val resources = context.resources
    val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android")
    return if (resourceId > 0) {
        resources.getDimensionPixelSize(resourceId)
    } else getDensity(context).toInt() * 56
}

答案 1 :(得分:0)

我正面临类似的问题。看起来只有在将CoordinatorLayoutView传递给Snackbar.make()时,边距底部才起作用。 我认为它与baseTransientBottomBar有关,并且在您传递CoordinatorLayoutView之后,它的大多数行为(如滑动到关闭)都将可用。也许可以覆盖baseTransientBottomBar以便将其应用于底边距。

答案 2 :(得分:0)

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

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

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>

然后从“活动”设置该Drawable

MainActivity.java

Snackbar snack = Snackbar
                 .make(activity,"Hello World ?",Snackbar.LENGTH_INDEFINITE);
        snack.getView()
        .setBackground(ContextCompat.getDrawable(getApplicationContext(),R.drawable.contianer_snackbar));
        snack.show();

结果