Android FAB HideBottomViewOnScrollBehavior 状态在更改片段后隐藏
Android FAB HideBottomViewOnScrollBehavior statys hidden after changing fragments
我正在使用抽屉式导航(结合 android 导航喷气背包组件)在多个片段之间导航。我在我的浮动操作按钮(位于协调器布局内)上使用 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>
该行为按预期进行。但是,如果我向上滚动并隐藏 FAB,然后我切换屏幕,FAB 保持隐藏状态。我本可以向下滚动以使 FAB 重新出现,但在某些情况下,当我无法向下滚动时(当我的 recyclerview 为空时),FAB 无法重新出现。
我试过这样做:
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()
}
}
}
}
我添加了一个导航目的地更改侦听器,我在其中强制 FAB 重新出现在我的 showFabs()
函数中,但它不起作用。
有人可以帮我解决这个问题吗?或者也许是一种更好的编码方式,以防我一直以错误的方式编码。
感谢您的帮助。
以此
改变你的"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);
}
}
}
}
在 google 修复它之前,它是我发现唯一有效的解决方案。
我正在使用抽屉式导航(结合 android 导航喷气背包组件)在多个片段之间导航。我在我的浮动操作按钮(位于协调器布局内)上使用 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>
该行为按预期进行。但是,如果我向上滚动并隐藏 FAB,然后我切换屏幕,FAB 保持隐藏状态。我本可以向下滚动以使 FAB 重新出现,但在某些情况下,当我无法向下滚动时(当我的 recyclerview 为空时),FAB 无法重新出现。
我试过这样做:
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()
}
}
}
}
我添加了一个导航目的地更改侦听器,我在其中强制 FAB 重新出现在我的 showFabs()
函数中,但它不起作用。
有人可以帮我解决这个问题吗?或者也许是一种更好的编码方式,以防我一直以错误的方式编码。
感谢您的帮助。
以此
改变你的"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);
}
}
}
}
在 google 修复它之前,它是我发现唯一有效的解决方案。