【问题标题】:Check if NavDestination represents a DialogFragment检查 NavDestination 是否代表 DialogFragment
【发布时间】:2020-12-08 18:02:57
【问题描述】:

我有一个围绕 CoordinatorLayout 中片段容器的 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 显示代码移动到片段中的 onResume,但是在仅打开警报对话框时首先隐藏它看起来很愚蠢。我意识到我也可以创建一个将其隐藏在onStop() 中的父 Fragment 类,但我尽量避免创建类层次结构层以使代码不那么脆弱(通过继承组合),并且我也想避免重复所有代码在应用程序上。

【问题讨论】:

    标签: android android-architecture-navigation


    【解决方案1】:

    对话目标实现FloatingWindow interface:

    NavDestination 子类的标记接口,浮动在其他目的地的视图上方(即DialogFragmentNavigator.Destination)。

    NavController.OnDestinationChangedListener 实例还可以根据目标是否为FloatingWindow 来自定义其行为。

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

    【讨论】:

    • 请注意,当您返回上一个(非对话)目的地时,您会收到另一个回调。您可以考虑使用argument based listener 来确定是否应该在特定目的地显示FAB 并跳过onViewCreated() 中的任何逻辑 - 这样无论您导航到哪个目的地,您都可以准确知道是否应该隐藏FAB .
    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 2016-10-28
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多