34

Follwing the new android snackbar, i'm trying to set it to be positioned on a specific y coordinate. Its seems to be not even a possible.

I've tried with getting the parent of the snackbar's view, but, there's nothing to be done to the parent for it to set the position of it.

mSnackBar.getView().getParent();

When digging into the actual class, there's an instance of mView, and mParent which is private, and can't be reached anyhow.

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

4

4 回答 4

82

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

例如,假设您现有的布局是 a 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不是 aCoordinatorLayout的 Snackbar 将沿着树向上走,直到它找到 aCoordinatorLayout或布局的根。

于 2015-07-18T22:45:41.037 回答
9

为 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();
于 2018-03-31T01:00:11.970 回答
1

我有一个有趣的想法给你。

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

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

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

于 2021-11-09T07:46:06.250 回答
0

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

androidx.constraintlayout.widget.ConstraintLayout

并为其添加依赖项:

implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"

于 2019-12-13T23:35:54.300 回答