注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接:http://developer.android.com/training/basics/actionbar/adding-buttons.html


Action Bar允许你为和应用当前Context相关的最重要的action事件添加按钮。那些在Action Bar中直接显示出来的图标或文字就是所谓的Action Buttons。在Action Bar中无法完整显示的或者不是足够重要的操作按钮,都被隐藏在了更多操作这一按钮中,如下图所示:

图1. 具有一个“搜索”的操作按钮和一个“更多操作”(action overflow)按钮(其中包含了更多的操作)的Action Bar

一). 在XML中列举出操作

所有的操作按钮还有其他在更多操按钮中的所有项目,都在一个菜单资源(menu resource)的XML文件中定义。为了把操作添加到Action Bar中,在项目的“res/menu/”目录下创建一个新的XML文件。

为每一个你希望添加到Action Bar中的项目添加一个<item>标签。例如:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Search, should appear as action button -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
android:showAsAction="ifRoom" />
<!-- Settings, should always be in the overflow -->
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:showAsAction="never" />
</menu>

上述用于声明的代码表明:如果Action Bar的空间充足,那么搜索的操作按钮将会显示,但是设置这一操作的按钮将永远在“更多操作”当中。(所有的操作都会默认的在“更多操作”中显示,但显示地为每个操作声明设计的意图是一个好的习惯)。

下载Action Bar图标:

为了和Android图标风格(iconography)达到完美的视觉效果,建议你使用Action Bar Icon Pack提供的图标。

这个“icon”属性字段需要一个图像的资源ID。在“@drawable/”之后跟随着的名字必须是一个你在项目工程的“res/drawable/”存储好的一幅位图文件。例如:“@drawable/ic_action_search”代表了“ic_action_search.png”。类似的,“title”属性字段使用的是在项目工程中“res/values/”目录下通过XML文件定义好的字符资源,这些都在Building a Simple User Interface有讨论过。(对应博客链接:http://www.cnblogs.com/jdneo/p/3439108.html

Note:

当为你的应用创建图标和其他位图时,一个很重要的事情是你最好为各种分辨率屏幕的设备准备多个版本。这些在课程:Supporting Different Screens有更多的讨论。

如果你的应用使用了Support Library来兼容低至Android 2.1版本的系统,“showAsAction”这一属性字段并不属于“android:”命名空间。不过这个属性字段由Support Library来提供,所以你必须定义你自己的XML命名空间,然后使用这个命名空间作为字段的前缀。(一个自定义的XML命名空间最好以你的应用名为基础,当然它可以是你希望的任何名字,并且它的作用域只在你声明它的文件这一范围内)例如:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
<!-- Search, should appear as action button -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
yourapp:showAsAction="ifRoom" />
...
</menu>

二). 为Action Bar添加操作

为了将这个菜单项添加进Action Bar,我们需要在你的activity中实现onCreateOptionsMenu()这一回调函数,以此来将菜单资源填充进菜单(Menu)对象中,例如:

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

三). 操作按钮的响应

当用户按下了其中一个操作按钮,或者“更多操作”中的操作按钮,系统会调用你的activity中的回调函数onOptionsItemSelected(),在你这个方法的实现中,对参数MenuItem调用getItemId()方法来确定是哪个按钮被按下了。返回的资源ID(ResId)是和你在<item>标签中“android:id”这一属性字段所声明的ID是对应的。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_search:
openSearch();
return true;
case R.id.action_settings:
openSettings();
return true;
default:
return super.onOptionsItemSelected(item);
}
}

四). 为上一级Activity添加返回操作

图2. Gmail的返回按钮

所有你的应用中非主入口的画面(即指的是除了你的应用的“home”画面外的所有其他画面)必须为用户提供一个导航至应用逻辑层次结构中的父画面,这可以通过让用户按下“Action Bar”中的“返回(Up)”按钮来实现。

当在Android 4.1(API Level 16)或更高的系统版本中运行时,或者使用Support Library提供的ActionBarActivity时,实现返回的导航功能,只需要你在清单文件中声明父Activity,并且激活action bar的返回按钮。

例如,你可以在清单文件中这样写:

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

之后通过调用setDisplayHomeAsUpEnabled()来激活返回按钮:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_displaymessage); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// If your minSdkVersion is 11 or higher, instead use:
// getActionBar().setDisplayHomeAsUpEnabled(true);
}

因为现在系统知道“MainActivity”是“DisplayMessageActivity”的父Activity,当用户按下返回按钮,系统将会自动地导航至父Activity,你不需要去对返回按钮做任何事件处理。

阅读Providing Up Navigation,获取更多信息。

【Android Developers Training】 7. 添加Action Buttons的更多相关文章

  1. 【Android Developers Training】 5. 序言:添加Action Bar

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 34. 添加一个简单的分享行为(Action)

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 9. 覆盖于布局之上的Action Bar

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 6. 配置Action Bar

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 8. 定义Action Bar风格

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 68. 序言:添加动画

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 66. 添加动画

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 4. 启动另一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 3. 构建一个简单UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. Node.js编写CLI的实践

    导语:通常而言,Node.js的应用场景有前后端分离.海量web页面渲染服务.命令行工具和桌面端应用等等.本篇文章选取CLI(Command Line Tools)这子领域,来谈谈Node.js编写C ...

  2. 【SoDiaoEditor电子病历编辑器】阶段性更新啦

    转眼距离上一次v2正式发布已经过去一个半月了.github期间不定期push了二十几次,同时感谢分布在广州.福建.上海.北京的一众小伙伴,正是你们给出的建议,才让SoDiaoEditor不断完善. 我 ...

  3. Redis学习-LUA脚本

    最近在做K线的项目中,需要计算商品的分时数据.为了保证多台机器对同一商品的计算的有序性,所以在Redis中进行计算,同时为了保证在分时数据计算过程的原子性所以使用了LUA脚本,Redis内置了对LUA ...

  4. MyBatis源码解读(2)——MapperProxy

    SqlSession可以说是整个MyBatis的重中之重,在SqlSession中涉及到前一篇四大对象:Executor.StatementHandler.ParameterHandler.Resul ...

  5. Spark实战之读写HBase

    1 配置 1.1 开发环境: HBase:hbase-1.0.0-cdh5.4.5.tar.gz Hadoop:hadoop-2.6.0-cdh5.4.5.tar.gz ZooKeeper:zooke ...

  6. GirdView分页

    给gridview增加以下时间,即可 设置pageindex 重新绑定数据 protected void GvMenu_PageIndexChanging(object sender, GridVie ...

  7. Neo4j 第二篇:图形数据库

    在深入学习图形数据库之前,首先理解属性图的基本概念.一个属性图是由顶点(Vertex),边(Edge),标签(Lable),关系类型和属性(Property)组成的有向图.顶点也称作节点(Node), ...

  8. Configure HttpClient correctly

    References: [1] http://dev.bizo.com/2013/04/sensible-defaults-for-apache-httpclient.html We have hit ...

  9. The dplyr package has been updated with new data manipulation commands for filters, joins and set operations.(转)

    dplyr 0.4.0 January 9, 2015 in Uncategorized I’m very pleased to announce that dplyr 0.4.0 is now av ...

  10. Java web开发中页面跳转小技巧——跳转后新页面在新窗口打开

    最近学习Java web,在学习过程中想实现一个需求,就是在jsp页面跳转的时候,希望跳转后的新页面在新窗口中打开, 而不是覆盖原来的页面,这个需求使我困惑了好长时间,后来通过大海捞针似的在网上寻找方 ...