如何将 snackbar 放置在导航栏之上?(Y 轴方向)

3
我有这个布局。
<?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 Snackbar。

enter image description here

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

1)如何使它位于导航栏之上(Z轴)?或者这是常见的行为吗?

2)您如何使它显示在底部导航栏之上?(Y轴)


请您提供所需的代码模板,这样我就能够轻松地从我的一侧重新创建问题。 - Gourav Saini
@Elad Benda 请尝试使用CoordinatorLayout作为根布局。 - navalkishoreb
7个回答

4
你很可能正在使你的布局适应系统窗口。虽然我在你的示例中没有看到它,但这正是它所做的。也许它也可以在其他地方设置。

系统窗口是屏幕的那些部分,在该部分,系统绘制非交互式内容(例如状态栏)或交互式内容(例如导航栏)。

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

这意味着它也会进入底部的导航栏和顶部的系统栏。
有一个简单的解决方法。您可以应用窗口插图

Chris Banes在那个博客中有一些不错的例子。

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

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

0

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

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

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

0

自 material-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>

0

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

如果您正在为Snackbar使用自定义布局,则可以考虑将android:elevation放置在其中。您也可以通过编程方式实现这一点。


你把 elevation 添加到了 constraintLayout 上,而不是 Snackbar,因为 Snackbar 没有 XML 存在? - Elad Benda
我认为这是你的 Snackbar 的自定义布局。 - Reaz Murshed
我已经从我的答案中删除了代码。然而,我认为在你的情况下设置高度应该是有效的。如果您能发布一些关于如何显示snackbar的代码,那将非常好,这样我们就可以看一下。 - Reaz Murshed

0

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

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

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

0

我同意@Knossos的观点,你还可以做一件事情,就是获取导航栏的高度,并给你的自定义 Snackbar 设置 margin 或者将 Snackbar 显示在一个位于导航面板上方的视图中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接