不再需要 setSupportActionbar 了吗?

Posted

技术标签:

【中文标题】不再需要 setSupportActionbar 了吗?【英文标题】:Is setSupportActionbar required anymore? 【发布时间】:2016-02-14 17:52:57 【问题描述】:

引入了新的Toolbar widget 并且它的AppCompat (android.support.v7.widget.Toolbar) 版本可用,是否还需要调用setSupportActionbar(toolbar)?或者调用 setSupportActionbar 有什么好处吗?现在我们可以设置标题、副标题、导航图标、导航图标点击监听器(getSupportActionBar().setDisplayHomeAsUpEnabled(true) 替换)、菜单、菜单点击监听器(选项菜单替换)等直接在工具栏上,而无需调用 setSupportActionbar。

【问题讨论】:

medium.com/@ZakTaccardi/… 谢谢@eee ...所以,只有当我们想要支持选项菜单等较旧的 API 时,我们才应该“setSupportActionbar”。除了这个“setSupportActionbar”有没有额外的优势? 【参考方案1】:

然而setSupportActionbar() 方法和ActionBar API 仍然是the documented way 实现应用栏,它看起来更像是一种将Toolbar 与开发人员习惯的熟悉API 一起使用的方式。实际上,ActionBar API 只会使事情变得复杂,请查看 this article 的示例。

如今,当单一 Activity 架构和 navigation component 被推荐用于实现 Android 应用程序时,使用 NavigationUI 库来 setup a fragment toolbar 非常容易,例如:

<!-- my_fragment.xml -->
<androidx.constraintlayout.widget.ConstraintLayout ...>

  <com.google.android.material.appbar.MaterialToolbar
    ...
    android:id="@+id/toolbar"
    app:menu="@menu/my_menu" />

</androidx.constraintlayout.widget.ConstraintLayout>
class MyFragment : Fragment() 
  ...

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
    super.onViewCreated(view, savedInstanceState)

    val navController = findNavController()
    binding.toolbar.setupWithNavController(navController)
    binding.toolbar.setOnMenuItemClickListener  ... 
  

真的就这么简单,因此您将获得一个带有自动设置标题、工作返回按钮和选项菜单的工具栏。 Here 您可以找到完整的 GitHub 示例,该示例演示了使用 NavigationUI 进行的最小工具栏设置。

那么,使用 ActionBar API 没有任何好处吗?也许我错了,但我认为它有用的唯一情况是单个 应用程序范围 工具栏。在这种情况下,您可以将工具栏放入您的活动中并在每个片段中进行不同的设置,例如通过覆盖onCreateOptionsMenu()。但是根据我的经验,片段之间的工具栏往往会有很大差异,因此为每个片段设置一个单独的工具栏会更容易,this thread 中讨论了选择。也可以看看导航组件文档:Support app bar variations。

【讨论】:

以上是关于不再需要 setSupportActionbar 了吗?的主要内容,如果未能解决你的问题,请参考以下文章

setSupportActionBar()方法报错

setsupportactionbar() 抛出错误

片段内的 setSupportActionBar

Android学习——setSupportActionbar传入实例报错

Android 数据绑定 SetSupportActionBar

如何在 android studio 中使用 setSupportActionBar 功能?