11

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

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

当用户点击更多数据时,主屏幕上的底部工作表也会发生变化。

所以我基本上在底部工作表中有一个嵌套导航,它位于主屏幕的主导航内部

我的问题是,在使用新的 Android Architecture ComponentsNavigation Controller时,有一个app:defaultNavHost="true"选项会拦截后退按钮。

这种对后退按钮的自动拦截使我的用户案例非常复杂。我想要的是当用户在主屏幕中时,底部工作表可以控制后退按钮,并且当用户交换主屏幕时,主屏幕控制后退按钮。

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

4

1 回答 1

10

Navigation 1.0.0-alpha04中的修复之一是 Navigation 自动将每个 Fragment 目的地设置为主导航Fragment ,这确保任何子 Fragment 管理器(例如嵌套导航图使用的管理器)将自动接收返回按钮按下外部片段管理器之前。

这意味着,如果您app:defaultNavHost="true"在另一个也在使用的 NavHostFragment 中使用 NavHostFragment app:defaultNavHost="true",它将开箱即用。如果您正在使用getChildFragmentManager()由 Navigation 创建的任何 Fragment 手动对添加到后台堆栈的事务进行分段,则同样的情况也适用。

原始问题中所述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
于 2018-08-27T23:11:29.917 回答