Android FAB HideBottomViewOnScrollBehavior在切换Fragment后保持隐藏状态

6

我正在使用抽屉式导航(与Android Navigation Jetpack组件相结合)在多个片段之间进行导航。 我在我的浮动操作按钮上(位于协调器布局内部)使用app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior",当我向上滚动时隐藏FAB,然后当我向下滚动时它会重新出现。 我的布局如下:

activity_main.xml

<androidx.drawerlayout.widget.DrawerLayout
    android:id="@+id/Drawer_Main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.main.main.MainActivity">

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:id="@+id/Layout_Coordinator_Main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
...

       <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/FAB_Add"
            style="@style/Locky.FloatingActionButton.Normal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="@dimen/fab_margin"
            app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"
            app:srcCompat="@drawable/ic_add" />


</androidx.coordinatorlayout.widget.CoordinatorLayout>

</androidx.drawerlayout.widget.DrawerLayout>

行为符合预期。然而,如果我向上滚动并隐藏了浮动操作按钮,然后切换屏幕,浮动操作按钮仍然保持隐藏。我可以向下滚动使浮动操作按钮重新显示,但在某些情况下我无法向下滚动(例如我的recyclerview为空),因此无法使浮动操作按钮重新显示。

我尝试过这样的操作:

MainActivity.kt

private fun navigationDestinationChangeListener(navController: NavController) {
    navController.addOnDestinationChangedListener { nc, nd, _ ->
        when (nd.id) {
            nc.graph.startDestination,
            R.id.Fragment_Card,
            R.id.Fragment_Device -> {
                _binding.DrawerMain.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)

                //Show all the FABs
                showFabs()
            }
            else -> {
                _binding.DrawerMain.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)

                //Hide all the FABs
                hideFabs()
            }
        }
    }
}

我添加了一个导航目标改变监听器,在我的showFabs()函数中强制使FAB重新出现,但这并没有起作用。 有人可以帮我解决问题吗?或者如果我一直在错误地编码,可能有更好的编码方式吗? 感谢您的帮助。

有人可以帮我吗? - Mervin Hemaraju
我也有同样的问题 :( - Joris
我尝试了几种方法来使用fab.show(),但显然它的行为没有在视图上执行hide()。如果你将来找到答案,请一定分享!:( - Mervin Hemaraju
1个回答

12

将您的"showFabs"替换为以下内容

Kotlin

fun showFab(fab: FloatingActionButton, isVisible: Boolean) {
    val layoutParams: ViewGroup.LayoutParams = fab.layoutParams
    if (layoutParams is CoordinatorLayout.LayoutParams) {
        val behavior = layoutParams.behavior
        if (behavior is HideBottomViewOnScrollBehavior) {
            if (isVisible) {
                behavior.slideUp(fab)
            } else {
                behavior.slideDown(fab)
            }
        }
    }
}

Java

public void showFabs(FloatingActionButton fab, boolean visible) {
    ViewGroup.LayoutParams layoutParams = fab.getLayoutParams();
    if (layoutParams instanceof CoordinatorLayout.LayoutParams) {
        CoordinatorLayout.Behavior coordinatorLayoutBehavior =
            ((CoordinatorLayout.LayoutParams) layoutParams).getBehavior();
        if (coordinatorLayoutBehavior instanceof HideBottomViewOnScrollBehavior) {
            @SuppressWarnings("unchecked")
            HideBottomViewOnScrollBehavior<FloatingActionButton> behavior =
                (HideBottomViewOnScrollBehavior<FloatingActionButton>) coordinatorLayoutBehavior;
            if (visible) {
                behavior.slideUp(fab);
            } else {
                behavior.slideDown(fab);
            }
        }
    }
}

在谷歌修复之前,这是我发现的唯一有效的解决方法。


你救了我一命啊,老兄!它像魔法一样运行得很好!非常感谢你。 - Mervin Hemaraju

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