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

Coordinate Back Button ownership in Nested Navigation Controllers

我有一个显示应用程序一般信息的主屏幕,以及一个显示附加信息的底部 sheet。

如果用户在导航抽屉菜单上单击某些内容并选择新屏幕,则主屏幕内容可能会发生变化。

主屏幕底部 sheet 也可以随着用户点击更多数据而改变。

所以我基本上 底部有一个嵌套导航 sheet,它进入主屏幕的主导航内部

我的问题是,当使用新的 Android 架构组件 Navigation Controller 时,有一个 app:defaultNavHost="true" 选项,它拦截了后退按钮。

后退按钮的这种自动拦截使我的用户案例非常复杂。我想要的是当用户在主屏幕时,底部 sheet 控制后退按钮,当用户切换主屏幕时,主屏幕控制后退按钮。

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

Navigation 1.0.0-alpha04 is that Navigation automatically sets each Fragment destination as the primary navigation fragment 中的一个修复,确保任何子片段管理器(例如嵌套导航图使用的那个)将在[=24]之前自动接收后退按钮按下=] 外部片段管理器。

这意味着如果您在另一个也使用 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