我怎样才能使小吃店位于导航栏上方? (y 轴)

How would can I make the snackbar to be above the navigation bar? (y axis)

我有这个布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/non_clickable_account_snackbar_constraint_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <android.support.v7.widget.Toolbar
      android:id="@+id/my_snackbar_toolbar"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent" />
  <com.google.android.material.button.MaterialButton
      android:id="@+id/my_snackbar_button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:text="@string/show_account_snackbar"
      android:theme="@style/Theme.GoogleMaterial.DayNight.Bridge"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

我有一个定制的class:

public final class MySnackbar<AccountT>
    extends BaseTransientBottomBar<MySnackbar<myT>> {

super(findTopMostFrameLayout(parent), content, new MySnackbarAnimation(content));

调用 "show()" 时,它会显示一个带有自定义布局的 android 小吃店。

当我显示 my_snackbar 时,它位于底部导航栏(z 轴)下方。

1) 如何让它位于导航栏(z 轴)的顶部?或者这是常见的行为?

2) 如何让它从顶部到底部导航栏可见? (y 轴)

我认为在您的 Snackbar 中设置一个 elevation 应该可以完成这项工作。

如果您的快餐店使用自定义布局,您可以考虑将 android:elevation 放入其中。您也可以以编程方式执行此操作。

我认为这可行。

Snackbar  snb = Snackbar.make(findViewById(targetView), snackMessage, duration);
View view = snb.getView();
view.setBackgroundColor(backgroundColour);
snb.setActionTextColor(textColor);
FrameLayout.LayoutParams params =(FrameLayout.LayoutParams)view.getLayoutParams();
params.gravity =  Gravity.CENTER_HORIZONTAL | Gravity.TOP;
params.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
view.setLayoutParams(params);

最简单的方法是将 AnchorView 设置为底部导航抽屉(如果可用)。

Snackbar snackbar= Snackbar.make(view, text, duration);
snackbar.setAnchorView(bottomBar);

另请检查您的主题和样式实现。您的问题也可能是由于主题和样式不当造成的。

您可能 layout fit to system windows。尽管我在您的示例中没有看到它,但这正是它的作用。也许也可以在其他地方设置。

System windows are the parts of the screen where the system is drawing either non-interactive (in the case of the status bar) or interactive (in the case of the navigation bar) content.

Most of the time, your app won’t need to draw under the status bar or the navigation bar, but if you do: you need to make sure interactive elements (like buttons) aren’t hidden underneath them. That’s what the default behavior of the android:fitsSystemWindows="true" attribute gives you: it sets the padding of the View to ensure the contents don’t overlay the system windows.

这意味着它也将位于底部的导航栏和顶部的系统栏下方。

有一个简单的解决方法。你可以 apply window insets.

Chris Banes 在那个博客中有一些很好的例子。

snackbarCustomLayout.setOnApplyWindowInsetsListener { view, insets ->
    view.updatePadding(bottom = insets.systemWindowInsetBottom)
    insets
}

请记住,您可能还需要应用左和/或右插图来处理横向模式。

Snackbar在不同的场景下实现有很多限制,同样的可以使用这个库SuperToasts

SuperActivityToast.create(context, new Style(), Style.TYPE_BUTTON).setButtonText("Open").setAnimations(Style.ANIMATIONS_POP).show();

我同意 你还可以做一件事,你可以获得导航栏的高度,并可以为你的自定义快餐栏留出边距,或者在导航栏上方的视图中显示快餐栏导航面板

ViewGroup.MarginLayoutParams Snackbar 的视图自 material-1.1.0 库版本以来已停止工作。 要定义自定义边距,您需要在 styles.xml:

中定义自定义 Snackbar 的样式
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
//your items
    <item name="snackbarStyle">@style/Snackbar</item>   //custom snackbar style
</style>

<style name="Snackbar" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:layout_margin">@null</item>
    <item name="android:layout_marginTop">0dp</item>
    <item name="android:layout_marginLeft">0dp</item>
    <item name="android:layout_marginRight">0dp</item>
    <item name="android:layout_marginBottom">50dp</item>   //custom bottom margin
</style>