嵌套导航控制器中的协调后退按钮所有权

时间:2018-08-27 20:56:28

标签: android android-architecture-components android-architecture-navigation

我有一个主屏幕显示应用程序的常规信息,并在底部显示其他信息。

如果用户在导航抽屉菜单上单击某些内容,然后选择一个新屏幕,则主屏幕内容可能会更改。

当用户单击以获取更多数据时,主屏幕上的底部工作表也会更改。

因此,我基本上在底部的工作表中有一个嵌套的导航,该导航位于主屏幕的主导航之内

我的问题是,当使用新的Android体系结构组件Navigation Controller时,有app:defaultNavHost="true"选项会拦截后退按钮。

后退按钮的这种自动拦截使我的用例非常复杂。我想要的是,当用户位于主屏幕中时,底部页面可以控制后退按钮,而当用户切换主屏幕时,则由主屏幕控制后退按钮。

是否可以通过编程方式控制app:defaultNavHost,以便嵌套的Navigation Controllers可以共存并协调后退按钮的所有权?

1 个答案:

答案 0 :(得分:5)

Navigation 1.0.0-alpha04中的一项修复功能是,导航自动将每个片段目标设置为primary navigation fragment,从而确保任何子片段管理器(例如嵌套导航图使用的子片段管理器)都将自动在外部片段管理器之前 接收返回按钮。

这意味着,如果您在同时使用app:defaultNavHost="true"的另一个NavHostFragment中使用带有app:defaultNavHost="true"的NavHostFragment,它将立即可用。如果您要手动进行碎片处理,并使用getChildFragmentManager()在导航创建的任何碎片中添加到后堆栈,则同样的事情同样适用。

the original issue中所述,app:defaultNavHost="true"正在使用现有的Fragment API,并且可以使用以下代码随时通过编程方式进行更改:

// This effectively removes the app:defaultNavHost flag
getSupportFragmentManager().beginTransaction()
    .setPrimaryNavigationFragment(null)
    .commit()
// Pass in your NavHostFragment to re-enable the flag