前(fei)言(hua):转行iOS开发半年,很久没接触Android了,前几天去上课,听着实在无聊,随手拿了同学的一本《Android UI设计》,发现有好多基础知识自己虽然用过,但是都是当初做Android开发时,当项目需要的用到的时候才去百度,control+c和control+v后,便草草完事,以至于有时再需要使用某个控件或者功能时,再去百度或者翻查以前的代码。虽然曾经做了2年Android开发,但只是做了几个很水的app,为了不亏欠那两年奋斗的青春,现在开始,我将写一些关于Android基础的blog,祭奠下学Android的两年青春。废话不多说,这是这个系列第一篇《ActionBar的使用(1)》

1.什么是ActionBar?

Android的action bar是一个window 特性,能显示用户现在所处app的哪个页面(显示页面标题)、提供动作按钮(搜索、新增等)和导航(返回),和iOS的UINavigationBar作用一样。直接上官方图:

这是一个ActionBar例子,包含 [1] app icon, [2] 两个action items, 和 [3] action overflow.

ActionBar从 Android 3.0 (API level 11) 开始提供,如果我们新建的项目仅支持Android 3.0及以上,我们可以直接使用框架中的ActionBar API。如果要在 Android 2.1 (API level 7)及以上版本中使用,可以通过添加android-support-v4.jar后使用。上面提到的两种情况下,大多数API是一样的,只是包名不同:

API11以上

import android.app.ActionBar

API11以下

import android.support.v7.app.ActionBar

考虑到现在的Android手机版本都在4.0以及上,本文主要使用android.app.ActionBar。

新建项目时,只要 targetSdkVersion 或者 minSdkVersion设置为“11”或以上 ,Activity默认使用主题为 Theme.Holo,都带有ActionBar了,如果不需要使用ActionBar,可以将主题设为Theme.Holo.NoActionBar。

1.获取、隐藏和显示ActionBar

ActionBar actionBar = getActionBar();//获取ActionBar

actionBar.hide();//隐藏ActionBar

当actionBar被隐藏后,系统会自动调节布局来适配屏幕空间,可以调用show()来让actionBar重新显示。

*使用android-support-v4时,将getActionBar()改为getSupportActionBar()

2.添加Action Items

当我们的activity start,系统会调用activity的onCreateOptionsMenu()方法来创建action items,使用这个方法来加载定义了action items的菜单资源,例如,要添加两个action items,在res目录下新建一个文件夹,命名为menu,并新建一个xml文件,命名为main_activity_actions.xml, 添加以下代码,这段代码定义了两个action items:

res/menu/main_activity_actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/action_search"android:icon="@drawable/ic_action_search"android:title="@string/action_search"/><item android:id="@+id/action_compose"android:icon="@drawable/ic_action_compose"android:title="@string/action_compose" />
</menu>

在activity的onCreateOptionsMenu()方法中,加载上面的布局

@Override
public boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu items for use in the action barMenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.main_activity_actions, menu);return super.onCreateOptionsMenu(menu);
}

运行后效果如下:

但是我们的需求是action item直接显示在actionBar上,而不是在action overflow中,因此需要在每个<item>中,添加showAsAction=“ifRoom”,那么只要空间足够,每个action item都将单独显示(不建议使用always),例如:

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:yourapp="http://schemas.android.com/apk/res-auto" ><item android:id="@+id/action_search"android:icon="@drawable/ic_action_search"android:title="@string/action_search"yourapp:showAsAction="ifRoom"  />...
</menu>

效果如下:

如果希望action item同时显示图片和文字,我们只要修改showAsAction的值:

showAsAction="ifRoom|withText"

3.处理action items的点击事件

当用户点击action时,系统会调用activity的 onOptionsItemSelected()方法,通过调用MenuItem的getItemId()方法,得到<item> 中id属性的值,就可以确定是哪个action被点击:

@Override
public boolean onOptionsItemSelected(MenuItem item) {// Handle presses on the action bar itemsswitch (item.getItemId()) {case R.id.action_search:openSearch();return true;case R.id.action_compose:composeMessage();return true;default:return super.onOptionsItemSelected(item);}
}private void openSearch(){System.out.println("action_search被点击了");}private void composeMessage(){System.out.println("action_compose被点击了");}

如果是使用fragment来inflate菜单,当用户单击action item时,系统会通过Fragment类的onCreateOptionsMenu()的回调,来调用 onOptionsItemSelected()方法。但是,activity会先处理点击事件,所以在activity的onOptionsItemSelected()中,要返回ture,activity中的fragments才有机会执行fragment的onCreateOptionsMenu()方法。

4.使用分隔的action bar

先上官方效果图:

分隔的actionBar可以将action item置于屏幕底部。如何实现呢?

1.如果API是14及以上,只需要在每个<activity> 或 <application>中添加 android:uiOptions=“splitActionBarWhenNarrow"

2.如果API是14以下,需要在每个 <activity>中添加 <meta-data>,如下:

<manifest ...><activity uiOptions="splitActionBarWhenNarrow" ... ><meta-data android:name="android.support.UI_OPTIONS"android:value="splitActionBarWhenNarrow" /></activity>
</manifest>

如果要实现图3中隐藏icon和title的效果,还需在activity中添加下面两行代码:

actionBar.setDisplayShowHomeEnabled(false) ;
actionBar.setDisplayShowTitleEnabled(false);

5.使用ActionBar上的icon来导航

可以将actionBar上的icon图标来作为返回按钮,就像iOS中的导航栏中的leftBarButtonItem,例如屏幕A显示一个列表,选择类表中的一项时,跳转到屏幕B,屏幕B可以包含返回按钮,来返回到屏幕A。

调用ActionBar实例的setDisplayHomeAsUpEnabled()方法即可显示actionBar的返回按钮(如下面代码)。现在可以看见了返回图标了。

actionBar.setDisplayHomeAsUpEnabled(true);

但是默认按了之后并没有任何效果。因此还需要使用下面两种方法的任何一种进行配置:

方法一。在manifest文件中声明上级activity

如果上级Activity是固定的,只需在manifest中声明,用户按了返回按钮后,actionBar就会自动跳回对应的activity,在Android 4.1 (API level 16)开始,可以在<activity>中直接设置parentActivityName属性来设置父activity,而在之前的版本中,添加一个<meta-data>元素来设置父activity:

<application ... >...<!-- The main/home activity (has no parent activity) --><activityandroid:name="com.example.myfirstapp.MainActivity" ...>...</activity><!-- A child of the main activity --><activityandroid:name="com.example.myfirstapp.DisplayMessageActivity"android:label="@string/title_activity_display_message"android:parentActivityName="com.example.myfirstapp.MainActivity" ><!-- Parent activity meta-data to support API level 7+ --><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value="com.example.myfirstapp.MainActivity" /></activity>
</application>

方法二。通过在Activity中overridegetSupportParentActivityIntent()和onCreateSupportNavigateUpTaskStack() 方法

这个方法适用于用户可能是通过不同的activity跳转到目前这个activity的情况,本文不做详细介绍,可以看官方文档:http://developer.android.com/training/implementing-navigation/ancestral.html

6.添加Action View

有时,简单的button并不能满足我们的需求,为了实现更多功能,我们还可以用action view.  action view是显示在actionBar 上作为相当于action button的wedget,例如,如果需要搜索功能,可以添加一个嵌入了SearchView widget的action view到actionBar中。如图所示是一个包含可折叠搜索栏的actionBar。

要声明一个action view,分别使用actionLayout 和actionViewClass 属性来说明需要使用的layout或者widget,例如,下面代码添加了SearchView widget:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/action_search"android:icon="@drawable/ic_action_search"android:title="@string/action_search"android:showAsAction="ifRoom| collapseActionView"android:actionViewClass="android.widget.SearchView" /></menu>

如果要配置action view(例如添加监听器),可以在onCreateOptionsMenu()中通过menu.findItem(R.id.action_search).getActionView()来获取,例如:

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu items for use in the action barMenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.main_activity_actions, menu);SearchView searchItem = (SearchView) menu.findItem(R.id.action_search).getActionView();//进行SearchView的设置,例如设置监听器等...return super.onCreateOptionsMenu(menu);}

其中关于SearchView控件的使用不在本文范围,可以参考官方文档:http://developer.android.com/guide/topics/search/search-dialog.html

由于篇幅关系,《ActionBar的使用(1)》先讲到这里,下一篇《ActionBar的使用(2)》将继续介绍ActionBar的其它用法(Action Provider、Navigation Tabs、Drop-down Navigation等),希望大家继续关注,我将尽快更新。

【Android】ActionBar的使用(1)相关推荐

  1. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  2. 无法为新的Android ActionBar支持找到Theme.AppCompat.Light

    本文翻译自:Can't Find Theme.AppCompat.Light for New Android ActionBar Support I am trying to implement th ...

  3. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  4. Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/act ...

  5. android搜索功能xml,Android_Android ActionBar搜索功能用法详解,本文实例讲述了Android ActionBar - phpStudy...

    Android ActionBar搜索功能用法详解 本文实例讲述了Android ActionBar搜索功能用法.分享给大家供大家参考,具体如下: 使用ActionBar SearchView时的注意 ...

  6. Android ActionBar高级自定义——设置标题居中和添加控件

    转载地址:http://blog.csdn.net/gtbluesky/article/details/44656567 关于ActionBar的一些常见使用方法我已经在之前两篇博文(Android ...

  7. Android ActionBar示例教程

    Today we will look into Android ActionBar. Action Bar is one of the important part of any applicatio ...

  8. Android ActionBar应用实战,高仿微信主界面的设计

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/26365683 经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对 ...

  9. android action bar 风格,Android ActionBar使用教程

    ActionBar的引入方式: 有几种,从 Android 3.0(API lever 11) 开始,所有使用 Theme.Holo 主题(或者它的子类)的 Activity 都包含了 action ...

  10. Android ActionBar相关

    1.Android 5.0 删除ActionBar下面的阴影 于Android 5.0假设你发现的ActionBar下面出现了阴影,例如,下面的设置,以消除阴影: getActionBar().set ...

最新文章

  1. git github 快速入门
  2. 比特币现金比BTC节能40%以上
  3. .Net学习笔记----2015-07-10(GDI绘图)
  4. rust(22)-不可变字符串借用
  5. Java黑皮书课后题第2章:2.3(将英尺转化为米)编写程序,读入英尺数,将其转换为米数并显示结果。1英尺等于0.305米
  6. 获取顺序容器vector,deque,string和array的首尾元素的方法有四个
  7. html火影忍者网页设计作品,纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例...
  8. 删除链表中指定节点,要求时间复杂度为O(1)
  9. html是执行语言吗,HTML的基本语言
  10. ORACLE表空间使用量查询SQL
  11. 新年第一份“欧气”,“中国开发者大调查”第五批中奖名单出炉啦
  12. android ViewFlipper的使用
  13. 小狗扫地机器人与石头_养宠物不卫生?石头扫地机器人和戴森,你都用对了吗?...
  14. Word转PDF方法(jacob插件)
  15. LEACH算法仿真实验
  16. GridinSoft CHM编辑器3.2.0多语言,轻松快速地翻译CHM电子书
  17. 导数、微分、偏导数、全微分、方向导数、梯度的定义与关系
  18. python字典相乘_python集合、元组、字典
  19. 动态规划-击爆气球 Burst Balloons
  20. group by column中的column与前面条件发生的错误的解决方案

热门文章

  1. Python 基础 - Day 2 Assignment - ShoppingCart 购物车程序
  2. 使用livereload实现自动刷新
  3. WPF Snoop 2.7 源码研究
  4. 六步使用ICallbackEventHandler实现无刷新回调
  5. Java开发字符串JSON处理
  6. 满足极高读写性能需求的Key-Value数据库
  7. HTTP长连接服务器端推技术
  8. asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】
  9. ASP.NET2.0 永恒密码之戒【月儿原创】
  10. HTML教程-各窗口间相互操作(Frame Target)