Toolbar的使用

来源:互联网 发布:企业网络信息安全培训 编辑:程序博客网 时间:2024/05/21 10:03

一. 概述

2013年开始谷歌倡导所谓的Android Style,由此出现了Android 3.0 以后的新控件ActionBar.
但是ActionBar在使用时有一堆问题,文字不能定制,位置不能改变,图标距离无法控制,暴露出了ActionBar设计的不灵活,无法满足开发者的需要.
于是推出了ActionBar升级版:Toolbar,以便满足开发者个性化定制状态的需求,并且提供了support library 向下兼容包
特点:Toolbar之所以使用灵活,是因为它其实就是一个ViewGroup,可以往里面放控件,
使用Toolbar:和使用普通的组件一样,在布局文件中声明即可。

二. 基本功能
  • 设置导航栏图标;
  • 设置App的logo;
  • 支持设置标题和子标题;
  • 支持添加一个或多个的自定义控件;
  • 支持Action Menu;
三. 使用Toolbar
3.1代码结构

3.2 实现步骤
(1)因为要使用 Toolbar,所以我们要通过清单文件让原本的 ActionBar 隐藏起来.
①可以改变某个activity的主题
 
②也可以改变某个app的主题
选中该行进入style文件中进行修改


修改为这样即可



这里选用第二种方法

清单文件代码如下

<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.dubuwucool.eventbusdemo"
>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
>
        <activity android:name=".activity.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".activity.EventBusSendActivity">
        </activity>
    </application>

</manifest>


res/values/style.xml文件代码如下

<resources>

    <!-- Base application theme. -->
    
<stylename="AppTheme"parent="Theme.AppCompat.NoActionBar">
        <!-- Customize your theme here. -->
        
<itemname="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>




(2)在布局中添加Toolbar控件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.zhiyuan3g.toolsbardemo.MainActivity">

<!--

Toolbar 是在 Android 5.0 才开始加上的,Google为了向下兼容,推出了兼容版包。为此,我们需要在工程中引入 appcompat-v7 的兼容包,使用android.support.v7.widget.Toolbar 进行开发。

这里设置Toolbar的背景颜色,Toolbar可以当容器来使用-->

 <android.support.v7.widget.Toolbar        android:id="@+id/toolsBar"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="#ff0202">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="666"            android:textSize="15sp"/>    </android.support.v7.widget.Toolbar></RelativeLayout>



(3)对Toolbar进行初始化
     Toolbar toolsBar = (Toolbar) findViewById(R.id.toolsBar);

(4)对Toolbar进行个性化设置
       toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);//设置导航栏图标
       toolbar.setLogo(R.mipmap.ic_launcher);//设置app logo    

 toolbar.setTitle("666");//设置主标题(注意使用他,要放在setSupportActionBar方法前)

         toolbar.setSubtitle("999");//设置子标题,子标题会出现在主标题正下方


这里的setLOGO和setNavigationIcon设置后看起来差不多.但如果你只设置 导航图标( or app logo) 和titlesubtitle,会发现 app logo 和 titlesubtitle 的间距比较小,看起来不如 导航图标 与 它们两搭配美观;

(5)在Res文件下创建Menu文件
如图所示创建menu文件夹


之后在创建toolbar_menu.xml文件



创建完成后如图所示:


完成后在该文件尽心设置,代码如下

<?xml version="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res - auto"
> <!--该行必须加-->
    
<item
        android:id="@+id/action_search"
        android:icon="@mipmap/ic_launcher"
        android:title="item0"
        app:showAsAction="always"
        
></item>
    <item
        android:id="@+id/action_search1"
        android:icon="@mipmap/ic_launcher"
        android:title="item1"
        app:showAsAction="always"
        
></item>
    <item
        android:id="@+id/action_search2"
        android:icon="@mipmap/ic_launcher"
        android:title="item2"
        app:showAsAction="always"
        
></item>
</menu>


该文件就是项放在Action Bar的右上角的选项菜单,对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。
  这个属性可接受的值有:
  1、always:这个值会使菜单项一直显示在Action Bar上。
  2、ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。
  3、never:这个值使菜单项永远都不出现在Action Bar上。
  4、withText:这个值使菜单项和它的图标,菜单文本一起显示。

(6)往Toolbar填充菜单布局并设置Toolbar的菜单点击事件,
 toolsBar.inflateMenu(R.menu.toolbar_menu);
    //toolbar点击事件
    toolsBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) { 

Toast.makeText(MainActivity.this,"您也点击了菜单", Toast.LENGTH_SHORT).show();

            return true;
        }
    });
}
(7)使用getMenuinflater()填充menu布局,第二个参数固定式menu,返回值为true才有效果
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar_menu,menu);
        return true;
}



四.主窗体代码
package com.zhiyuan3g.toolsbardemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {
    private Toolbar toolsBar;

    /**
     * 使用ToolsBar基本步骤
     * 1.隐藏原本的ActionBar,可以通过清单文件修改我们的基础主题
     可以改变某个activity的主题 android:theme="@style/Theme.AppCompat.NoActionBar"
     * 也可以改变某个应用主题
     * 2.在布局中声明Toolbar
     * 3.代码中初始化Toolbar
     * 4.Toolbar做个性化设置
     * 5.设置Toolbar的菜单点击事件,Res文件下创建Menu文件
     * 6.重写onCreateOptionsMenu方法
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化控件
        initView();
        //设置主标题,必须要在 setSupportActionBa代码执行循序的前面
       toolsBar.setTitle("主标题");
        //必须有的一步操作,参数为Toolbar对象
       setSupportActionBar(toolsBar);
        //设置导航栏图标
       toolsBar.setNavigationIcon(R.mipmap.ic_launcher);
        //设置applogo
        toolsBar.setLogo(R.mipmap.ic_launcher);
        //设置子标题
       toolsBar.setSubtitle("子标题");

        //Toolbar填充菜单布局
       toolsBar.inflateMenu(R.menu.toolbar_menu);
        //toolbar点击事件
       toolsBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {

Toast.makeText(MainActivity.this,"您也点击了菜单", Toast.LENGTH_SHORT).show();

                return true;
            }
        });
    }
    //使用getMenuinflater()填充menu布局,第二个参数固定式menu,返回值为true才有效果
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar_menu,menu);
        return true;
}

    private void initView() {
        toolsBar = (Toolbar) findViewById(R.id.toolsBar);
    }
}

五.实验结果














2 0