【问题标题】:Navigation Component: How to set drawer with toolbar in each fragment导航组件:如何在每个片段中设置带有工具栏的抽屉
【发布时间】:2020-10-05 18:44:44
【问题描述】:

我正在使用导航组件,并希望将抽屉布局与每个片段中的工具栏连接起来,而不是活动。

我尝试了在 onViewCreated() 上调用的 answer,但从活动引用的任何视图都是空的。我猜这是因为在从 Activity 的 onCreate 方法返回之前,fragment 在布局中被膨胀了。

我使用此扩展函数将抽屉与片段的工具栏连接起来,我尝试从 onCreateView() 和 onViewCreated() 调用它,但没有成功,并且活动的抽屉布局始终为空。我只在从 onStart() 调用它时才工作,但我认为这不是正确的方法:

private fun AppCompatActivity.setToolbar() {
    setSupportActionBar(binding.toolbar)
    setHasOptionsMenu(true)
    val drawer = findViewById<DrawerLayout>(R.id.drawer)
    binding.toolbar.setupWithNavController(findNavController(), drawer)
}

调用这个函数的正确位置是什么?

【问题讨论】:

  • 你在使用&lt;fragment&gt;标签吗?这个答案在使用FragmentContainerView 时非常有效,这是添加NavHostFragment 的推荐方式。
  • @ianhanniballake 原来这是问题所在。我以前更喜欢fragment 而不是FragmentContainerView,因为它显示了预览。你能解释一下为什么fragment 不起作用吗?

标签: android navigation-drawer android-architecture-navigation android-navigation android-navigation-graph


【解决方案1】:

当您调用setContentView(R.id.activity_layout) 时,整个视图层次结构首先被膨胀,然后附加到 Activity。只有在setContentView() 返回之后,findViewById() 才能找到任何新膨胀的视图。

当您使用&lt;fragment&gt; 标签时,Fragment 的视图及其所有子 Fragment 的视图将作为该通胀调用的一部分同步创建。这意味着在调用 onCreateView()onViewCreated() 方法时,setContentView() 尚未完成。这就是调用 findViewById() 返回 null 的原因 - 活动的视图实际上还没有完成创建。

FragmentContainerView 是专门为避免这些特殊情况而构建的,而是使用与其他片段相同的机制 - 即,它只是使用普通的FragmentTransaction 来添加你的片段 - 就像你调用 beginTransaction()+@ 987654332@ 自己在你的onCreate() 方法中。这意味着 Fragment 不会被强制同步创建其视图作为 setContentView() 的一部分,而是可以与所有其他 Fragment after setContentView() 返回一起创建。这就是允许来自onCreateView()onViewCreated()findViewById() 工作的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多