本节摘要:Toolbar 是应用栏的现代实现——一个可放进任意布局的普通控件,接管标题、返回导航与菜单动作。本节给猜数字 App 的战绩页装上 Toolbar,走完"替换默认栏、加菜单、分流动作、启用返回"四步,并厘清它与 ActionBar 的关系。
每个 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 后,返回栈、抽屉菜单、底部导航全围绕应用栏展开;先把"标题、菜单、返回"三件套玩熟,迁移时只是换引擎不换驾驶习惯。
