是否可以通过导航组件将片段作为弹出窗口

时间:2019-08-23 13:34:23

标签: android kotlin popup fragment

我想在recyclerView中按下一个项目(片段a,主片段),通过导航打开另一个片段(片段b,细节)。该片段(片段b)具有一个以屏幕为中心的constraintLayout(包含有关该项目的信息),而不占用窗口中的所有空间。片段b中的背景(constraintLayout和frameLayout)设置为background:transparent,不起作用。我想在背景中看到片段a(最好是稍微模糊一下),使片段b弹出。

我能够通过片段a中的新视图(布局)在片段“ a”中创建弹出窗口。但是重要的是将弹出窗口隔离在其他文件中。我不希望片段b中的代码使片段a中的代码混乱。片段a具有处理recyclerView的代码,片段b也是如此。 我想我看不到片段“ a”的原因是片段b没有放在片段“ a”的顶部。而是在视图中将其替换。

在iOS中,可以设置类似的Navigation并指定所需的是将目标视图放到“源”视图的顶部(将视图添加到视图堆栈的顶部,而不是替换视图)。可以在Android中进行一些配置来解决我的问题吗?

我已经考虑了“动作”,尝试了Android Studio中的某些配置,但是看起来好像不是我想要的东西,至少我无法产生期望的结果。

val actionMinDetail = MinFragmentDirections.actionToMinDetailFragment(id)
        Navigation.findNavController(view).navigate(actionMinDetail)

1 个答案:

答案 0 :(得分:0)

因此,经过反复试验,我最终找到了解决方案。

@Zack Bvy: 我确实尝试了DialogFragment,但无法将其用作弹出窗口。新的DialogFragment最终占据了整个屏幕。正如我所说的,这是导航显示新片段的罪魁祸首。导航会切换您所在的视图,并将其替换为目标视图,这就是导航的工作原理。

我确实尝试过使用supportFragmentManager,但是android studio并不想这么做。 在活动中时,可以使用supportFragmentManager,但不能在片段中使用。在一个片段中时,您可以使用childFragmentManager。这样就成功了,新片段的行为就像一个弹出窗口。

    val fm = childFragmentManager
    val someDetailDialogFragment = SomeDetailDialogFragment()

    // and some arg transfer
    val args = Bundle()
    args.putString("id", id)
    someDetailDialogFragment.arguments = args
    someDetailDialogFragment.show(fm, "Fragment_tag")