android - 导航组件:如何在每个片段中设置带有工具栏的抽屉
问题描述
我正在使用导航组件,并希望将抽屉布局与每个片段中的工具栏连接起来,而不是活动。
我尝试了这个在 onViewCreated() 上调用的答案,但是从活动中引用的任何视图都是空的。我猜这是因为片段在从活动的 onCreate 方法返回之前在布局中膨胀。
我使用此扩展函数将抽屉与片段的工具栏连接起来,我尝试从 onCreateView() 和 onViewCreated() 调用它,但没有工作,并且活动的抽屉布局始终为空。我只在从 onStart() 调用它时才工作,但我认为这不是正确的方法:
private fun AppCompatActivity.setToolbar() {
setSupportActionBar(binding.toolbar)
setHasOptionsMenu(true)
val drawer = findViewById<DrawerLayout>(R.id.drawer)
binding.toolbar.setupWithNavController(findNavController(), drawer)
}
调用此函数的正确位置是什么?
解决方案
当您调用setContentView(R.id.activity_layout)
时,整个视图层次结构首先被膨胀,然后附加到 Activity。只有在setContentView()
返回后findViewById()
才能找到任何新膨胀的视图。
当您使用<fragment>
标签时,片段的视图及其所有子片段的视图将作为该膨胀调用的一部分同步创建。这意味着在调用和方法时还setContentView()
没有完成。这就是调用返回 null 的原因 - 活动的视图实际上还没有完成创建。onCreateView()
onViewCreated()
findViewById()
FragmentContainerView
是专门为避免这些特殊情况而构建的,而是使用与其他片段相同的机制——即,它只是使用法线FragmentTransaction
来添加你的片段——就像你自己在方法中调用beginTransaction()
+一样。这意味着 Fragment 不会被强制同步创建其视图作为 的一部分,而是可以在返回后与其他所有 Fragment 一起创建。这就是允许或工作的原因。commitNow()
onCreate()
setContentView()
setContentView()
findViewById()
onCreateView()
onViewCreated()
推荐阅读
- java - 使用用户输入来迭代和填充 LinkedHashMap,避免重复而无需 try-catch 和搜索键
- code-coverage - 了解覆盖模块如何工作
- r - 默认清空数据表的搜索栏,而不是包括突出显示的文本
- laravel - Laravel Google Login、Calendar 和 Drive 多个 API 集成
- jsp - 从 JSP 文本框获取值到同一页面上的 jsp 变量
- sql - IBM DB2 SQL 休眠、等待或延迟存储过程
- java - 使用 webview 和进度条的应用程序看不到 Admob 广告
- windows - .pdb 文件被另一个进程使用,无法关闭
- javascript - 两次点击调度动作 Redux
- c++ - C++ 捕获屏幕片段以进行进一步处理