Android标题栏Toolba和ActionBar对比精炼详解

一、前期基础知识储备

上官方文档,A standard toolbar for use within application content.
A Toolbar is a generalization of action bars for use within application layouts. While an action bar is traditionally part of an Activity's opaque window decor controlled by the framework, a Toolbar may be placed at any arbitrary level of nesting within a view hierarchy. An application may choose to designate a Toolbar as the action bar for an Activity using the setActionBar() method.
Toolbar supports a more focused feature set than ActionBar. From start to end, a toolbar may contain a combination of the following optional elements:

由官方文档我们知道,Toolbar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用Toolbar,因为Toolbar能够使应用程序给用户提供一致的界面,并且系统能够很好根据不同的屏幕配置来适应操作栏的外观。你能够用Toolbar的对象的API来控制操作栏的行为和可见性。

二、上代码,具体实现

(1)先来看看Action Bar

在Android5.0之前,开发者定义标题栏的样式用的是Action Bar,Action Bar是一种新増的导航栏功能,在Android3.0之后加入到系统的API当中。不管是使用Toolbar还是ActionBar,定义好的标题栏都可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作。

首先,我们看看AndroidStudio默认支持的样式,可以看到除了第一,其他都有标题栏的存在,我们选择“empty”新建一个项目,如图建立一个Application名为AnteaTaxt的应用程序。


进入第一个Activity界面,就会发现,该界面顶部已经出现了默认的背景为蓝色的标题栏,标题栏的文字就是应用程序的名字,这是系统默认的,如果开发者没有设置Activity的label标签,那么就会默认使用程序名。

1)修改标题栏文字

在AndroidManifest文件中的Activity中添加label标签,如下

       <activity
            android:name=".MainActivity"
            android:label="食蚁兽">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

运行效果如图:


2)删除默认标题栏

在Activity中调用hide()方法即可。

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
        if(actionBar != null){
            actionBar.hide();
        }

运行效果如图:


3)为标题栏增加图标

ActionBar可以根据需要添加文字或者是图标,过多的话会隐藏在overflow按钮里面(右面的三点)当Activity启动时,调用onCreateOptionsMenu来取出所有按钮,加载menu资源,具体实现代码如下:

首先新建menu文件夹,在其中新建menu.xml文件

<?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/action_compose"
        android:icon="@drawable/search"
        app:showAsAction="always"
        android:title="搜索"/>
    <item
        android:id="@+id/action_delete"
        android:icon="@drawable/share"
        app:showAsAction="always"
        android:title="分享"/>
    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/touch"
        app:showAsAction="ifRoom"
        android:title="版本"/>
</menu>

这里用了三个item实现了三个Action按钮

id:每一个按钮的标识    

icon : 定义的图标  

title :要显示的文字(图标正常,通常不显示文字)

showAsAction :指定按钮显示位置

always表示永远显示在actionbar上,屏幕空间不足,不显示

ifRoom表示屏幕空间够显示在ActionBar中,不够就显示在overflow中

never则永远显示在overflow中

然后Activity中调用ActionBar的标准方法来加载menu资源

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    @Override
    public boolean onCreateOptionsMenu (Menu menu){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu,menu);
        return super.onCreateOptionsMenu(menu);
    }
}

运行效果如图:

              

如上图所示,按照showAsAction指定值的不同,标题栏的加载样式也不同。控件足够就按第一幅图加载,空间不够就按第二幅图样式加载,点击右边的三个点的按钮之后,会得到第三幅图,可以看到之前的按钮都在里面了。

我们也可以再次修改代码,这次让图标和文字一起显示出来:

protected boolean onPrepareOptionsPanel(View view, Menu menu) {
        if (menu != null) {
            if (menu.getClass() == MenuBuilder.class) {
                try {
                    Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e) {
                }
            }
        }
        return super.onPrepareOptionsPanel(view, menu);
    }

运行效果如图:


———————————————————我是分隔线——————————————————

(2)接着我们在看看Toolbar

Toolbar是Android5.0(API 21)引入的,取代之前的ActionBar,它的本质是一个View,使用起来更加灵活,功能也更加强大。

1)Toolbar的组成如下


①为Toolbar整体,继承ViewGroup,是个容器控件,自己包含了①—⑥,而⑦是Activity中引入的;

②为导航按钮,类型为ImageButton,可设置点击事件,用于返回上个页面或者滑出侧滑菜单;

xml属性:app:navigationIcon="@drawable/xxx"//引入一张图标;

③为Logo展示图,类型为ImageView,不响应事件,仅仅作为展示。

xml属性:app:logo="@drawable/xxx"//引入一张图标;

④为主标题,类型为TextView;xml属性:app:title

⑤为副标题,类型为TextView;xml属性:app:subtitle

⑥为普通子View,标题和菜单之间是留给我们添加子View的区域;

⑦为菜单ActionMenuView,负责管理选项菜单,菜单本身可以点击。

注意:Toolbar控件在布局文件中可以2个图标,3段文字,只有第一个图标可设置点击事件,标题栏的这个位置最常用来放置返回按钮图标。

2)具体使用Toolbar创建一个标题栏

在主布局XML文件中使用Toolbar

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.administrator.anteatext.MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        app:navigationIcon="@drawable/returrn"
        app:logo="@drawable/other"
        app:title="标题"
        app:subtitle="小标题">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:padding="4dp"
            android:text="其他文字区域"
            android:id="@+id/free_child"
            android:layout_gravity="center"
            android:background="#ffffff"/>
    </android.support.v7.widget.Toolbar>
</LinearLayout>

在Activity代码中处理Toolbar

这是完整的代码段;

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
        android.support.v7.app.ActionBar actionBar = getSupportActionBar();
        if(actionBar != null){
            actionBar.hide();
        }
        //生成选项菜单
        mToolbar.inflateMenu(R.menu.main);
        //设置选项菜单的菜单项的点击事件
        mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this, "点击了菜单项" + item.getTitle(), Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "点击了导航按钮!", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

接着来拆分一下这段代码,可以分为三个部分:

//像获取普通控件那样获取Toolbar  
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);	
//设置导航按钮的点击事件  
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {  
    @Override  
    public void onClick(View v) {  
        Toast.makeText(MainActivity.this, "点击了导航按钮!", Toast.LENGTH_SHORT).show();  
    }  
});
//生成选项菜单  
mToolbar.inflateMenu(R.menu.action_menu_main);  
//设置选项菜单的菜单项的点击事件  
mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {  
    @Override  
    public boolean onMenuItemClick(MenuItem item) {  
        Toast.makeText(MainActivity.this, "点击了菜单项" + item.getTitle(), Toast.LENGTH_SHORT).show();  
        return true;  
    }  
}); 

新建menu菜单文件main.xml

<?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:title="item_01"  
        android:id="@+id/item_01"  
        app:actionViewClass="android.support.v7.widget.SearchView"  
        app:showAsAction="always"/>  
    <item android:title="item_02"  
        android:id="@+id/item_02"  
        />  
    <item android:title="item_03"  
        android:id="@+id/item_03"/>  
    <item android:title="item_04"  
        android:id="@+id/item_04"/>  
</menu> 

运行效果如图,重点观察一共有三个元素可以创建交互操作:

 

 

 总结:本节内容主要是利用ActionBar和Toolbar各自实现了一个标题栏,由于从Android5.0开始谷歌官方就不再推荐使用ActionBar,而是转而使用功能更加强大的Toolbar。所以学会利用Toolbar开发,势在必行,各种各样的炫酷标题栏都可以依靠Toolbar实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值