7.2 Toolbar顶部应用栏


7.2 Toolbar 顶部应用栏

本节摘要:Toolbar 是应用栏的现代实现——一个可放进任意布局的普通控件,接管标题、返回导航与菜单动作。本节给猜数字 App 的战绩页装上 Toolbar,走完"替换默认栏、加菜单、分流动作、启用返回"四步,并厘清它与 ActionBar 的关系。

从系统默认栏到自己的 Toolbar

每个 Activity 默认顶上有一条系统应用栏,但它不可定制、只能换标题。现代做法:主题里声明 NoActionBar 交还默认栏,布局里放一个 Toolbar 想怎么摆就怎么摆。第 6 章的主题基座 Theme.Material3.DayNight.NoActionBar 已经提前打了 NoActionBar 补丁,现在只需三步接线:

<androidx.coordinatorlayout.widget.CoordinatorLayout ...> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" /> </com.google.android.material.appbar.AppBarLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

?attr/actionBarSize 是 6.2 节问主题要属性的直接应用——高度取系统标准应用栏尺寸;?attr/colorPrimary 让栏色自动跟随主题,夜间模式零成本。布局里放好还得在代码里"认领"它为这个 Activity 的应用栏:

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) setSupportActionBar(binding.toolbar) supportActionBar?.title = "战绩" }

setSupportActionBar 之后,这个普通控件就享有了 ActionBar 的全部协议:标题、副标题、菜单、返回箭头都能挂上来。Toolbar 本质是"ActionBar 的可插拔版"——能塞进任意层级、能和搜索框并排、能让同一 App 不同页面长得不一样,这是旧 ActionBar 做不到的。

菜单:动作的正规收容所

战绩页右上角要放"清空记录"与"分享"。动作按钮的正规家是 menu 资源,res 下新建 menu/menu_history.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_clear" android:title="清空记录" app:showAsAction="never" /> <item android:id="@+id/action_share" android:title="分享战绩" app:showAsAction="ifRoom" /> </menu>

showAsAction 决定去处:ifRoom 有地方就上图钉进栏里,never 永远收进三点菜单。低频动作收三点、高频动作进栏面是分发标准;"清空"是破坏性低频操作,收进三点菜单还能多一步缓冲,与 5.3 节的反馈礼仪一脉相承。加载与分流在 Activity 里两步:

override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_history, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.action_clear -> { confirmClear(); true } R.id.action_share -> { shareResult(); true } else -> super.onOptionsItemSelected(item) } }

when 分发沿用 1.3 节的穷举风格,else -> super 兜底让系统动作(未来加的搜索、设置)仍有人接。

返回箭头:跨页导航的锚点

战绩页是从主界面进来的二级页,左上角该有返回箭头。manifest 里给 Activity 声明逻辑父级,再开一个开关:

<activity android:name=".HistoryActivity" android:parentActivityName=".MainActivity" />
supportActionBar?.setDisplayHomeAsUpEnabled(true)

点箭头自动回到父级,不用自己写 finish。这里藏着一个入门期最值得建立的意识:Toolbar 是应用级导航的地基——现在它是两个页面的连线,将来接 Jetpack Navigation 后,返回栈、抽屉菜单、底部导航全围绕应用栏展开;先把"标题、菜单、返回"三件套玩熟,迁移时只是换引擎不换驾驶习惯。

图:应用栏的解剖与动作分流

图:应用栏的解剖与动作分流

本节要点回顾

  • NoActionBar 加 setSupportActionBar:交还默认栏,认领自己的 Toolbar。
  • ?attr 三连:actionBarSize 定高、colorPrimary 定色,主题换肤零成本。
  • menu 资源是动作的家:when 分流,else 交 super 兜底。
  • ifRoom 与 never 分流标准:高频进栏面,低频尤其破坏性收三点。
  • parentActivityName 声明父级:返回箭头自动导航,为 Navigation 打地基。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U