android - Android Jetpack Navigation:如何在 OnNavigatedListener 中获取目的地的片段实例?
问题描述
我在 android 开发中使用 Jetpack 导航组件(一个活动,许多片段)。
我想在OnNavigatedListener
下面获得目的地的片段实例。
可能吗?
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(this, R.layout.activity_main)
navController = Navigation.findNavController(this, R.id.nav_host_fragment)
navController.addOnNavigatedListener { controller, destination ->
// Here
}
}
}
更新:场景
我想在每次导航的活动中获取片段的属性(或方法的返回值)。
例如,
val fragment = getFragmentInstanceFromDestination()
myActionBar.visible = fragment.getActionBarVisible()
解决方案
如果您使用的是该1.0.0-alpha07
版本,以前可以执行以下操作:
(destination as? FragmentNavigator.Destination)?.let { destinationClass ->
val isNewFullscreen = destinationClass.fragmentClass.superclass == FullScreenFragment::class.java
//... adjust paddings and hide action bar, etc.
这是我为具有两个 Fragment 超类的单个 Activity 应用程序采用的方法,其中一个是 FullScreenFragment(您可以在示例中看到正在使用的那个),它隐藏了操作栏和导航栏以及 NavigationFragment(名称是令人困惑,但这个显示了导航栏和操作栏)。
这样做的问题是,您还需要调整默认导航片段的填充,至于 FullScreenFragments 它将占据整个屏幕,而 NavigationFragment 应该同时考虑操作和导航栏。
现在随着新1.0.0-alpha08
的FragmentNavigatio.Destination.fragmentClass
不再可用,所以我仍在考虑如何解决这个问题。我正在考虑使用destination.id == R.id.someFullScreenFragment
,它肯定比我目前使用的要少,但我必须跟踪一个 id 列表。
无论哪种方式,据我所知,获取 Fragment 本身的实例是不可能的,您能做的最好的事情就是推断目的地并让您的单个活动相应地编排视图。
推荐阅读
- spring-boot - 如何去除原木的颜色?
- javascript - 类型错误:无法读取 null 反应的属性 offsetTop。未安装的组件
- fortran - OpenMP 在嵌套并行内累积数组
- powershell - PowerShell 脚本中的 Get-ChildItem 权限被拒绝错误
- python - 安装 ufw 后无法通过 python 脚本在 443 上发出请求
- r - 如何按 ID 和年份创建具有编号实例的列
- reactjs - 使用 ReactJS 在 Redux Store 中存储多个值
- c# - 尝试在 listview MVVM Xamarin 中设置选择器
- git - 保护密码不被推送到 GitHub
- google-cloud-automl - 如何使用 python 部署 Google Cloud NLP