如何将 Android SnackBar 调整到屏幕上的特定位置

How can you adjust Android SnackBar to a specific position on screen

在新的 android 小吃店之后,我试图将其设置为定位在特定的 y 坐标上。这似乎是不可能的。

我已经尝试获取 snackbar 视图的父视图,但是,对于设置它的位置的父视图没有什么可做的。

mSnackBar.getView().getParent();

深入研究实际 class 时,有一个 mView 实例和一个私有的 mParent 实例,无论如何都无法访问。

https://developer.android.com/reference/android/support/design/widget/Snackbar.html

可以通过在现有 Activity 布局中放置 android.support.design.widget.CoordinatorLayout 来设置 Snackbar 的显示位置。

例如,假设您现有的布局是 RelativeLayout,您可以按如下方式添加 CoordinatorLayout

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:id="@+id/myCoordinatorLayout"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">
</android.support.design.widget.CoordinatorLayout>

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

final View viewPos = findViewById(R.id.myCoordinatorLayout);    
Snackbar.make(viewPos, R.string.snackbar_text, Snackbar.LENGTH_LONG)
                            .setAction(R.string.snackbar_action_undo, showListener)
                            .show();

这将导致 Snackbar 显示在提供给 make() 函数的 CoordinatorLayout 底部

如果您传递的 View 不是 CoordinatorLayout,Snackbar 将沿着树向上移动,直到找到 CoordinatorLayout 或布局的根。

为 Snackbar 明确定义布局可能并不总是可行的。

问题似乎是针对父项,而不是 Snackbar。

Snackbar snackbar = Snackbar.make(layout, message, duration);
View snackbarLayout = snackbar.getView();
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT, 
    LinearLayout.LayoutParams.WRAP_CONTENT
);
// Layout must match parent layout type
lp.setMargins(50, 0, 0, 0);
// Margins relative to the parent view.
// This would be 50 from the top left.
snackbarLayout.setLayoutParams(lp);
snackbar.show();

除了brentm的回答,我不得不使用:

androidx.constraintlayout.widget.ConstraintLayout

并为其添加依赖:

implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"

我有一个有趣的想法要告诉你。

您只需使用下面的代码即可到达您想要的位置。

Snackbar.make(View,Message , Snackbar.LENGTH_LONG)
.setAnchorView(pb)
.show();

这里setAnchorView是用来改变位置的。您可以在 xml 文件中创建布局。只需在 setAnchorView 中调用您的布局,它就会显示在 xml 布局的位置。