当前位置: 首页 > 知识库问答 >
问题:

是否还需要setSupportActionbar?

陈松
2023-03-14

随着新的工具栏小部件的引入和AppCompat(android.support.v7.widget.Toolbar)版本的推出,是否还需要调用setSupportActionbar(工具栏)?或者调用setSupportActionbar有什么好处吗;现在我们可以设置标题、子标题、导航图标、导航图标单击侦听器(getSupportActionBar()。直接在工具栏上设置DisplayHomeAsupEnabled(true)replacement)、menu、menu click listener(options menu replacement)等,而无需调用setSupportActionbar。

共有1个答案

陶俊晤
2023-03-14

然而,setSupportActionbar()方法和ActionBar API仍然是实现应用程序栏的有文档记录的方式,它看起来更像是一种使用工具栏和开发人员熟悉的API的方式。实际上,ActionBar API通常只会使事情复杂化,请以本文为例。

如今,当推荐使用单一活动架构和导航组件来实现Android应用程序时,使用NavigationUI库设置片段工具栏非常容易,例如:

<!-- 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 { ... }
  }
}

这真的很简单,因此你会得到一个工具栏,自动设置标题,后退按钮和选项菜单。在这里,您可以找到完整的GitHub示例,该示例演示了使用NavigationUI的最小工具栏设置。

那么,使用ActionBar API根本没有好处?也许我错了,但我认为它唯一有用的情况是一个应用程序范围的工具栏。在这种情况下,您可以将工具栏放在活动中,并在每个片段中进行不同的设置,例如通过重写创建选项菜单()。但根据我的经验,工具栏往往在不同的片段之间有很大的差异,因此更容易为每个片段使用单独的工具栏,本文将讨论选择。您还可以查看导航组件文档:支持应用程序栏变体。

 类似资料:
  • 问题内容: 我正在使用Hibernate Search,文档和书籍说我在id字段上需要@DocumentId,以便Hibernate Search可以知道如何将索引映射到对象。 没有代码中的@DocumentId,我的代码似乎运行良好。Hibernate Search是否变得足够聪明,以至于@Id字段是一个很好的默认值?是否会引起一些不明显的问题? 谢谢你的时间! 问题答案: 如果您使用的是老式的

  • 问题内容: 以下代码: 是/是打开JDBC连接所必需的。 我听说现代JDBC驱动程序不再需要它。但是我无法在项目中将其删除,因为我遇到了异常。我正在使用Java7和tomcat7。 什么时候可以省略构建? 问题答案: 从JDBC 4.0开始,不需要Class.forName()。 这是JDBC的Java教程的摘录。 在 早期 版本的JDBC中,要获得连接,首先必须通过调用方法Class.forNa

  • 问题内容: 我需要从该站点下载哪个tar? 我已经尝试过fortrans,但是一直出现此错误(明显地设置了环境变量之后)。 问题答案: 该SciPy的网页用来提供构建和安装说明,但说明现在依靠操作系统二进制分发。要在没有预编译所需库软件包的操作系统上构建SciPy(和NumPy),必须先构建然后静态链接到Fortran库BLAS和LAPACK: 仅执行五个g77 / gfortran / ifor

  • 问题内容: 这可能是愚蠢的问题。Hyperledger Fabric是否需要Docker才能运行。 我只是想知道,仅当我们需要在同一台物理机中将Fabric peer,orderer或benchDB作为虚拟机运行时才需要Docker。我认为,如果我们在单独的同一台服务器上本地安装这些软件(对等,订单,couchDB等),则可能不需要Docker。 谢谢。 问题答案: 只是要注意这一点,尽管您不需要

  • 我使用testAd ID(ca-app-pub-3940256099942544/1033173712)从admob不是我的admob ID,我需要使用addTestDevice()太,而在移动设备测试?它甚至显示了测试广告屏幕,而不是实时广告。 因为我这样做了,我整天都在使用我的应用程序进行测试,晚上我收到了账户暂停邮件。

  • 问题内容: 我有两个线程,我想确保我在LinkedBlockingQueue上正确进行了同步。这正确吗?还是不需要在(messageToCommsQueue)上进行显式同步? 宣言: 方法一: 方法二: 问题答案: 是的,没有必要。JavaDoc说: BlockingQueue实现是线程安全的。