<Android 基础(六)> ActionBar

介绍

Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且ActionBar还可以自动适应各种不同大小的屏幕。下面是一张使用ActionBar的界面截图:

其中,[1]是ActionBar的图标,[2]是两个action按钮,[3]是overflow按钮。

基本使用

添加ActionBar



–布局文件–

AndroidStudio自动创建的MainActivity继承自AppCompatActivity本身携带有ActionBar,这里想要使用ToolBar来实现ActionBar的功能,需要先修改下theme

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

使用Theme.AppCompat.Light.NoActionBar作为activity的风格,这里插述一下相关属性代表的界面位置

创建ToolBar对应的xml文件

toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

</android.support.v7.widget.Toolbar>

这里把这个文件单独作为一个xml方便多个layout中包含

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootlayout"
    tools:context="mraz.com.actionbardemo.MainActivity"
    android:orientation="vertical">

    <include layout="@layout/toolbar"/>
    <TextView
        android:id="@+id/tv_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</LinearLayout>

主界面对应的layout中include刚才创建的toolbar.xml文件

main_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_search"
        android:icon="@drawable/ic_search_black_24dp"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:title="Search"
        android:inputType="textCapWords"
        android:imeOptions="actionSearch"
        android:orderInCategory="80"
        app:showAsAction="ifRoom|collapseActionView"/>

    <item android:id="@+id/action_settings"
        android:icon="@drawable/ic_apps_black_24dp"
        android:title="Settings"
        android:orderInCategory="100"
        app:showAsAction="always"/>

    <item android:id="@+id/action_info"
        android:title="Details"
        android:icon="@drawable/ic_report_black_24dp"
        android:orderInCategory="90"
        app:showAsAction="ifRoom"/>

</menu>

menu 对应的属性解释一下

属性值 意义
id 控件id
title 标题(必需)
icon 图标
showAsAction 控制显示到actionbar还是overflow
actionViewClass 构建视图所使用的View
actionProviderClass 基本同上
menuCategory 同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他种类菜单项的后面。
orderInCategory 同种类菜单的排列顺序。该属性需要设置一个整数值,越小越靠左

showAsAction的几个属性,解释一下

属性 意义
ifRoom 根据当前的空间大小调整
never 永远不会显示。只会在溢出列表中显示,而且只显示标题,所以在定义item的时候,最好把标题都带上
always 无论是否溢出,都会显示
withText withText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可能显示不全。
collapseActionView 声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。一般要配合ifRoom一起使用才会有效果。


–代码使用–

package mraz.com.actionbardemo;

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

public class MainActivity extends AppCompatActivity {

    LinearLayout rootlayout;

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

        rootlayout = (LinearLayout) findViewById(R.id.rootlayout);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_menu_black_24dp);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_info:
                Snackbar.make(rootlayout, " Info ", Snackbar.LENGTH_SHORT).show();
                break;
            case R.id.action_search:
                Snackbar.make(rootlayout, " Search ", Snackbar.LENGTH_SHORT).show();
                break;
            case R.id.action_settings:
                Snackbar.make(rootlayout, " Settings ", Snackbar.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

比较关键的只有3行代码

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //获取toolbar

setSupportActionBar(toolbar); //设置成ActionBar

getMenuInflater().inflate(R.menu.main_menu, menu); //创建actionbar的菜单项

有了这些代码基本上就可以显示ActionBar,当然要实现与用户的交互,就需要对每一个item做对应的响应处理,这里根据菜单的id,做了简单的Snackbar的展示,开发者可以根据自己的需要实现更复杂的逻辑

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_info:
                Snackbar.make(rootlayout, " Info ", Snackbar.LENGTH_SHORT).show();
                break;
                ……
    }

–效果图–


使用Action View

上面的例子中有个比较特殊的Menu Item

    <item android:id="@+id/action_search"
        android:icon="@drawable/ic_search_black_24dp"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:title="Search"
        android:inputType="textCapWords"
        android:imeOptions="actionSearch"
        android:orderInCategory="80"
        app:showAsAction="ifRoom|collapseActionView"/>

这里使用了actionViewClass,这个要设置shwoAsAction为 ifRoom|collapseActionView使用才行,其实删除collapseActionView,也是可以正常使用,只是体现的方式不一样。获取SearchView的方式

MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) item.getActionView();

SerachView 对象拿到之后可以对其属性进行操作。给Action View添加展开和收起的事件监听,实现方式

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        MenuItem searchitem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchitem.getActionView();
        MenuItemCompat.setOnActionExpandListener(searchitem, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                Snackbar.make(rootlayout, " onMenuItemActionExpand ", Snackbar.LENGTH_SHORT).show();
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                Snackbar.make(rootlayout, " onMenuItemActionCollapse ", Snackbar.LENGTH_SHORT).show();
                return true;
            }
        });
        return true;
    }

拿到searchItem之后,执行

MenuItemCompat.setOnActionExpandListener(searchitem, new MenuItemCompat.OnActionExpandListener() );

–效果图–


使用ActionProviderClass

menu文件中使用

<item android:title="Share"
    android:actionProviderClass="android.widget.ShareActionProvider"
    android:orderInCategory="100"
    app:showAsAction="always"
    />

类似的方式获取ActionProvider

MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider mShareActionProvider = (ShareActionProvider)
                MenuItemCompat.getActionProvider(shareItem);
mShareActionProvider.setShareIntent(……);

针对ActionProvider可以实现自定义的ActionProvider,继承基础类ActionProvider


ActionBar导航

启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。

我们可以通过调用setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

此时ActionBar左侧会出现一个返回的按钮

针对这返回按钮的事件响应还是在public boolean onOptionsItemSelected(MenuItem item) 方法中实现,它有一个固定的资源Id—- android.R.id.home

case android.R.id.home:
     finish();
     break;

简单的执行下和返回键相同的操作。结束当前activity

实现Activity之间的快速切换

新建一个ParentActivity.java

package mraz.com.actionbardemo;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class ParentActivity extends AppCompatActivity {

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

        final Context mContext = this;
        TextView textView = (TextView) findViewById(R.id.tv_parent);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(mContext , MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

AndroidManifest.xml文件中做如下修改


    <application
        ……>
        <activity android:name=".ParentActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <activity android:name=".MainActivity"
            android:parentActivityName="mraz.com.actionbardemo.ParentActivity">
        </activity>

    </application>

这一句很关键

android:parentActivityName=”mraz.com.actionbardemo.ParentActivity”>

设置父Activity的名称,ParentActivity为启动Activity同时是MainActivity的父Activity

然后在MainActivity中针对这个返回按钮做一下处理,不再是简单的结束掉当前的这个Activity了,需要做出对应的导航的处理逻辑

 case android.R.id.home:
     Intent upIntent = NavUtils.getParentActivityIntent(this);
     if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
         TaskStackBuilder.create(this)
                         .addNextIntentWithParentStack(upIntent)
                         .startActivities();
         } else {
             upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             NavUtils.navigateUpTo(this, upIntent);
         }
     break;

其中,调用NavUtils.getParentActivityIntent()方法可以获取到跳转至父Activity的Intent,然后如果父Activity和当前Activity是在同一个Task中的,则直接调用navigateUpTo()方法进行跳转,如果不是在同一个Task中的,则需要借助TaskStackBuilder来创建一个新的Task。

这样,就按照标准的规范成功实现ActionBar导航的功能了。

–效果图–

时间: 2024-10-13 01:13:57

<Android 基础(六)> ActionBar的相关文章

Android 面试题总结之Android 基础(六)

Android 面试题总结之Android 基础(六) 在上一章节Android 面试题总结之Android 基础ListView(五) 主要是ListView的优化,原理以及一些基本问题. 在阅读过程中有任何问题,请及时联系.如需转载请注明 fuchenxuan de Blog 本章系<Android 之美 从0到1 – 高手之路>Android基础将会总结了Android 布局常见面试问题.其实对于基础方面Android 开发来说,经常面试无非就是UI,网络,数据库,这三大方面,本章节总结

Android学习路线(六)为Android应用添加ActionBar

Action bar 是你可以为你的应用的Activity实现的最为重要的设计元素之一.它提供了集中UI特性,并且通过提供和其他的Android应用的一致性体验让你的应用能够很快被用户熟悉.主要的功能包括: 一个专用的显示应用表示的地方,并且能够指出用户当前在应用中的位置. 用户能够很方便地访问重要的功能(例如搜索). 提供视图切换导航(通过tab,或者下拉列表). 这次的训练课程提供了对action bar基础知识的快速引导.有关action bar的各种特性的更多信息,请查看Action B

android 基础学习图片六progross

加载进度条应用 android 基础学习图片六progross,布布扣,bubuko.com

2015年最新Android基础入门教程目录(完结版)

2015年最新Android基础入门教程目录(完结版) 标签(空格分隔): Android基础入门教程 前言: 关于<2015年最新Android基础入门教程目录>终于在今天落下了帷幕,全套教程 共148节已编写完毕,附上目录,关于教程的由来,笔者的情况和自学心得,资源分享 以及一些疑问等可戳:<2015最新Android基础入门教程>完结散花~ 下面是本系列教程的完整目录: 第一章:环境搭建与开发相关(已完结 10/10) Android基础入门教程--1.1 背景相关与系统架构

《2015最新Android基础入门教程》完结散花~

<2015最新Android基础入门教程>完结散花~ 标签(空格分隔): 反思小结 引言: 从六月底就开始编写这套教程,历时将近五个多月,今天终于写完了,全套教程正文部分148篇, 十大章,从基本UI控件到四大组件,Intent,Fragment,事件处理,数据存储,网络编程,绘图与动画, 多媒体,系统服务等都进行了详细的讲解!代码都是都是在Android Studio上进行编写的,全文 采用Markdown,行文结构清晰,还结合了实际开发中一些常见的问题进行了剖析-由于个人能力的局限, 虽然

Android基础入门教程——4.1.2 Activity初窥门径

Android基础入门教程--4.1.2 Activity初窥门径 标签(空格分隔): Android基础入门教程 本节引言: 上一节中我们对Activity一些基本的概念进行了了解,什么是Activity,Activity的生命周期,如何去启动一个Activity等,本节我们继续来学习Activity,前面也讲了一个App一般都是又多个Activity构成的,这就涉及到了多个Activity间数据传递的问题了,那么本节继续学习Activity的使用!另外关于传递集合,对象,数组,Bitmap的

Android基础之——MacOSX下elipse开发环境的配置

前不久换了台macbook,然后自己就把开发环境给配好了,本来这事就这么过去了,今天有位博友留言让我写一篇关于配置的文章,考虑到这个东西确实以后可能还会用,那就写下来,分享给大家,正好自己也再次回顾一下,熟悉熟悉. 一.下载adt mac版下载地址:http://developer.android.com/sdk/index.html 二.配置jdk 下载完成后将adt解压到指定路径,打开终端,使用指令: java -version 如果能够显示具体的版本,说明本机安装有java,那么可以直接使

Android基础知识【项目实训】【3】

[该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 综合案例 [目标] 欢迎界面过后,应该显示app的主界面了,根据[UI设计指导]中的规划,主界面采用上下两级标签导航.这部分是app开发中比较麻烦的一块. 1.先来看一下,最终的效果吧,这样做起来比较有底: 默认显示的主界面,下部是主导航,上面是二级导航,默认打开的是"促销打折"这一版面

Android基础入门教程——5.2.1 Fragment实例精讲——底部导航栏的实现(方法1)

Android基础入门教程--5.2.1 Fragment实例精讲--底部导航栏的实现(方法1) 标签(空格分隔): Android基础入门教程 本节引言: 在上一节中我们对Fragment进行了一个初步的了解,学习了概念,生命周期,Fragment管理与 Fragment事务,以及动态与静态加载Fragment.从本节开始我们会讲解一些Fragment在实际开发 中的一些实例!而本节给大家讲解的是底部导航栏的实现!而基本的底部导航栏方法有很多种, 比如全用TextView做,或者用RadioB

2015年最新Android基础入门教程目录(临时版)

2015年最新Android基础入门教程目录(临时版) 标签(空格分隔): Android基础入门教程 前言: 嗯,昨晚又给人盗号了,博客上被发表了十几篇黄贴-然后目录给管理误删了,再发一次 后来协商后发现实被设密保问题了,建议各位用csdn的朋友密保自己设置一波~ 密保问题已修改回来了,应该不会再被盗号了-人怕出名猪怕壮哈~下次如果发现博客被封 告知下小猪,如何很急的话可以先到w3c鸟巢菜鸟教程上看Android基础入门教程 经过站长FK进行排版的,可能阅读体验会比csdn好很多!内容基本是同