协调嵌套导航控制器中的后退按钮所有权
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
我有一个显示应用程序一般信息的主屏幕,以及一个显示附加信息的底部 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