因为ActionBar的设计缺陷不能实现Material Design的效果,所以已经不推荐了,而是推荐使用Toolbar,Toolbar可以实现ActionBar的所有功能,灵活性高,可以配合其它控件完成Material Destion的效果,下面具体来说一下使用方法:
1、因为使用ToolBar代替ActionBar所以西药修改作主题不带actionBar
①、深色主题
heme.AppCompat.NoActionBar
②、淡色主题
Theme.AppCompat.Light.NoActionBar
2、在main_activity.xml文件中使用:
因为要覆盖actionBar,所以宽度设置位match_parent,高度为actinBar的高度(?attr/actionBarSize)
<androidx.appcompat.widget.Toolbar
android:id="@+id/top_title_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
3、MainActivity中传toolbar到actionBar
// toolbar设置到ActionBar
setSupportActionBar(findViewById(R.id.top_title_bar))
supportActionBar?.apply {
// 给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
setDisplayHomeAsUpEnabled(true)
// 这个小于4.0版本的默认值为true的。但是在4.0及其以上是false,该方法的作用:决定左上角的图标是否可以点击。
// 没有向左的小图标。 true 图标可以点击 false 不可以点击。
setHomeButtonEnabled(true)
}
4、res新建menu文件夹,然后新建xml文件
①、enabled 设置为true可以点击,false不可点击
②、icon 显示的图片
③、showAsAction 显示样式
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/start_stop"
android:enabled="true"
android:icon="@drawable/ic_start"
android:title="@string/start_end_pft"
app:showAsAction="ifRoom" />
<item
android:id="@+id/restart"
android:enabled="false"
android:icon="@drawable/ic_restart"
android:title="@string/restart_pft"
app:showAsAction="ifRoom" />
<item
android:id="@+id/completed"
android:enabled="false"
android:icon="@drawable/ic_complete"
android:title="@string/completed_pft"
app:showAsAction="ifRoom"
/>
</menu>
5、加载toolbar.xml文件
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.pft_action,menu)
return super.onCreateOptionsMenu(menu)
}
6、处理各个按钮的点击时间
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
finish()
return true
}
if (item.itemId == R.id.start_stop) {
Log.d(TAG, "startStop ")
return true
}
if (item.itemId == R.id.restart) {
Log.d(TAG, "restart ")
return true
}
if (item.itemId == R.id.completed) {
Log.d(TAG, "completed")
return true
}
return super.onOptionsItemSelected(item)
}
7、 onPrepareOptionsMenu 的使用
作用:菜单显示前做一些准备工作
使用场景:
①、菜单的可见性需要根据页面的状态进行调整时
②、菜菜单的状态需要根据某些条件动态调整时
调用时机:在调用invalidateOptionsMenu()或者按下菜单键时调用
可以在方法里面修改菜单的可见性和属性等
private var startStop: MenuItem? = null
private var reStart: MenuItem? = null
private var completed: MenuItem? = null
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
startStop = menu.findItem(R.id.start_stop)
reStart = menu.findItem(R.id.restart)
completed = menu.findItem(R.id.completed)
startStop!!.isVisible = true
reStart!!.isVisible = true
completed!!.isVisible = true
startStop!!.setIcon(R.drawable.ic_start)
reStart!!.isEnabled = false
completed!!.isEnabled = true
return super.onPrepareOptionsMenu(menu)
}
8、invalidateOptionsMenu()
invalidateOptionsMenu() 用于表示Android的菜单内容已更改,应重新绘制菜单。 例如,您单击一个按钮会在运行时添加另一个菜单项,或隐藏菜单项组。 在这种情况下,应该调用invalidateOptionsMenu(),以便系统可以在 UI 上重新绘制它。 此方法是操作系统调用 onPrepareOptionsMenu() 的信号,可以在其中实现必要的菜单操作。 此外, OnCreateOptionsMenu() 在活动(片段)创建期间仅调用一次,因此此方法无法处理运行时菜单更改。
引用自:https://blog.csdn.net/geoffrey00/article/details/118907164