Material控件之Toolbar使用详解

一、简介:

因为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

猜你喜欢

转载自blog.csdn.net/qq_26554909/article/details/135372136