我如何使快餐栏位于导航栏上方? (y轴)

时间:2020-03-18 16:13:16

标签: android android-snackbar android-navigation-bar

我有这个布局

<?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>

我有一个定制的课程:

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

使用

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

调用"show()"时,它会显示一个具有自定义布局的android快餐栏。

enter image description here

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

1)如何使其位于导航栏(z轴)的顶部?还是这是常见的行为?

2)您将如何使其从顶部导航到底部导航栏? (y轴)

7 个答案:

答案 0 :(得分:1)

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

系统窗口是系统绘制非交互式(对于状态栏而言)还是交互式(对于导航栏而言)内容的屏幕部分。

在大多数情况下,您的应用无需在状态栏或导航栏下绘制,但是如果这样做,则需要确保交互元素(如按钮)没有隐藏在它们的下方。这就是android:fitsSystemWindows =“ true”属性的默认行为:它设置了View的填充,以确保内容不会覆盖系统窗口。

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

对此有一个简单的解决方法。您可以apply window insets

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

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

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

答案 1 :(得分:0)

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

如果您为小吃店使用自定义布局,则可以考虑将android:elevation放在其上。您也可以通过编程方式进行。

答案 2 :(得分:0)

我认为这会起作用。

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);

答案 3 :(得分:0)

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

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

还请检查您的主题和样式实现。由于主题和样式不正确,也会出现您的问题。

答案 4 :(得分:0)

Snackbar在不同情况下要实现有很多限制,您可以将此库用于相同的SuperToasts

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

答案 5 :(得分:0)

我同意@Knossos,您还可以做一件事,即获得导航栏的高度,并为自定义小吃栏提供边距,或者在导航面板上方的视图内显示小吃栏。

答案 6 :(得分:0)

自材料1.1.0库版本以来,Snackbar的

ViewGroup.MarginLayoutParams视图已停止工作。 要定义自定义边距,您需要在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>