android - 检查 NavDestination 是否代表 DialogFragment

标签 android android-architecture-navigation

我有一个围绕 CoordinatorLayout 中的 fragment 容器的 Activity 布局。切换目标时,我想隐藏 FAB 并关闭 SnackBar(如果当前显示其中一个),并让目标 Fragment 在其 onViewCreated() 中重新显示 FAB(如果需要)。这与 Material Design 指南一致,即当您切换目的地时,FAB 应该明显消失并重新出现。

所以我这样做了:

navController.addOnDestinationChangedListener { _, navDestination, _ ->
    binding.floatingActionButton.apply {
        hide()
        setOnClickListener(null)
    }
    currentSnackbar?.dismiss()
    //...
}

但是,当 DialogFragment 是导航目标时,前一个 Fragment 在返回时不会再次调用 onViewCreated(),因为它从未离开过屏幕。

NavDestination 似乎没有任何方法来检查它是否表示 DialogFragment,即使 XML 区分 fragmentdialog

我意识到我可以将显示代码的 FAB 移动到 fragment 中的 onResume,但是在仅打开警报对话框时首先隐藏它看起来很愚蠢。我意识到我也可以创建一个将它隐藏在 onStop() 中的父 Fragment 类,但我尽量避免在可能的情况下创建类层次结构层以使代码不那么脆弱(继承组合),而且我也希望避免在整个应用程序中重复代码。

最佳答案

对话框目标实现 FloatingWindow interface :

A marker interface for NavDestination subclasses that float above the view of other destinations (i.e. DialogFragmentNavigator.Destination).

NavController.OnDestinationChangedListener instances can also customize their behavior based on whether the destination is a FloatingWindow.

因此,您可以使用 if (!(navDestination is FloatingWindow)) 忽略导航到对话框。

关于android - 检查 NavDestination 是否代表 DialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65204366/

相关文章:

android - 为什么在 Android 中使用一个特殊的文件来存储安装 id 而不是 SharedPreferences?

java - 根据导航目的地更新 ActionBar 菜单

android - 如何让 android 导航编辑器在多个屏幕上工作

Android 导航组件 - 实现监听器

android - 从 compose 导航到 Fragment

android - 防止在 BottomNavigationView 中快速单击

Android:自 SDK 1.0 以来我错过了什么?

java - 错误类型 3. React Native 中不存在 Activity 类 {com.project/com.project.MainActivity} (Visual studio EMulator for Android)

java - 使用 PrettyTime 库格式化时间

Android 构建变体签名配置