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

Dus*_*Dus 18 android android-view snackbar android-snackbar

掌握新的android小吃吧,我试图将它设置为特定的y坐标.它似乎甚至不可能.

我已经尝试过获取快餐栏视图的父级,但是,没有什么可以做父母设置它的位置.

mSnackBar.getView().getParent();
Run Code Online (Sandbox Code Playgroud)

在挖掘实际的类时,有一个mView的实例,而mParent是私有的,无论如何都无法访问.

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

Bre*_*ntM 55

通过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>
Run Code Online (Sandbox Code Playgroud)

然后,确保将the 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();
Run Code Online (Sandbox Code Playgroud)

这将导致在小吃吧被显示在底部的的CoordinatorLayout提供到该制作()函数.

如果您传递的View不是CoordinatorLayoutSnackbar,它将向上走到树上,直到它找到CoordinatorLayout布局的根或其根.

  • 如果您使用的是 Android X,则可以使用 setAnchorView 方法。https://developer.android.com/reference/com/google/android/material/snackbar/BaseTransientBottomBar.html#setanchorview (4认同)
  • 这似乎工作完美。我的要求是在一个片段中显示 2 个小吃栏。因此,我添加了 2 个协调器布局并将它们传递给各自的“Snackbar”对象。然而,当第二个出现时,第一个就消失了。有没有办法让它们都可见? (2认同)

Aba*_*art 8

为 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();
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

Snackbar.make(View,Message , Snackbar.LENGTH_LONG)
.setAnchorView(pb)
.show();
Run Code Online (Sandbox Code Playgroud)

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