【问题标题】:Show snack bar above FAB in androidx在 androidx 中的 FAB 上方显示小吃店
【发布时间】:2019-02-17 12:25:42
【问题描述】:

尝试使用 androidx 创建应用程序。 我的布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.photo.PhotoFragment">


    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerPhoto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_anchorGravity="top|center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:itemCount="48"
        tools:layoutManager="GridLayoutManager"
        tools:listitem="@layout/recycler_photo_item"
        tools:spanCount="3" />

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/photoCoordinator"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        >

        <com.google.android.material.bottomappbar.BottomAppBar
            android:id="@+id/mainBottomAppBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            app:fabAlignmentMode="center"
            android:backgroundTint="@color/colorPrimary"
            app:fabCradleMargin="@dimen/cradle_margin"
            app:fabCradleRoundedCornerRadius="@dimen/corner_radius"
            app:hideOnScroll="true"
            app:navigationIcon="@drawable/ic_menu_24px" />

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/photoFab"
            style="@style/Widget.MaterialComponents.FloatingActionButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_camera_alt_24px"
            app:layout_anchor="@id/mainBottomAppBar" />

    </androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

它看起来像 当我展示小吃店时,它看起来像这样 谷歌说小吃栏应该显示在底部应用栏和晶圆厂的上方,但是当我试图显示带有底部边距的小吃栏时我不能

val snackbarView = snackbar.view
    val params = snackbarView.layoutParams as CoordinatorLayout.LayoutParams

    params.setMargins(
            params.leftMargin + marginSide,
            params.topMargin,
            params.rightMargin + marginSide,
            params.bottomMargin + marginBottom
    )

    snackbarView.layoutParams = params

工厂升级! 如何在 fab 和底部应用栏上方显示小吃栏? 对不起我的英语!

【问题讨论】:

标签: android kotlin floating-action-button android-snackbar material-components-android


【解决方案1】:

在材质组件库中使用Snackbar,并使用setAnchorView方法使Snackbar出现在特定视图上方。

在您的情况下,您可以使用:

FloatingActionButton fab = findViewById(R.id.photoFab);
Snackbar snackbar = Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG);
snackbar.setAnchorView(fab);

【讨论】:

    【解决方案2】:

    因此,您遇到的问题是 Google 仍未更新 FAB 行为以与新设计保持一致。由于您的 FAB 位于协调器布局中,并且您正在使用它来启动您的小吃店,因此 FAB 向上移动以适应(旧行为)

    一些解决方案:

    1. 将 FAB 移出协调器布局,然后将其覆盖在上面 底部应用栏的顶部及其父协调器布局
      • 这可能会扰乱 FAB 与底部应用栏的任何交互。这可能不是一个好的长期解决方案,因为将 FAB 置于协调器中通常是一个好主意
    2. 移除 FAB 行为

      • 这将删除 FAB 所做的任何行为。与从协调器中删除它的缺点相同,只是它更容易逆转。出于这个原因,我更喜欢这个解决方案而不是第一个解决方案
      • 您可以在 XML 中使用:

        app.layout_behavior=""
        
      • 或者在代码中使用:

        CoordinatorLayout.LayoutParams params = 
                        (CoordinatorLayout.LayoutParams) 
        yourView.getLayoutParams();
        params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
        yourView.requestLayout();
        

    Google 似乎仍在更新行为来源。完成后,您可能希望将其删除,以便它可以使用其默认行为:

    https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/floatingactionbutton/FloatingActionButton.java

    【讨论】:

      【解决方案3】:

      Google 似乎更新了指南,但没有更新 SDK 以及它自己的应用程序(如 Gmail)。

      我在这里报告过这个:

      https://issuetracker.google.com/issues/122163315

      【讨论】:

        猜你喜欢
        • 2015-11-15
        • 2016-04-01
        • 1970-01-01
        • 2018-05-04
        • 2020-05-18
        • 2020-05-22
        • 2020-04-07
        • 2022-10-08
        • 2021-07-10
        相关资源
        最近更新 更多