操作栏允许你为与当前应用上下文相关的重要操作添加按钮。那些直接一图标或者文字方式显示在操作栏上的叫做“操作按钮”(action button)。另外那些操作栏放不下的或者并不是那么重要的可以隐藏在操作栏的额外操作中(action overflow,译者注:这个就是下图中竖着三个点的那个菜单,overflow有溢出的意思。可以理解为,操作栏放不下的(或者是不重要的)按钮就溢出到这个菜单中了。)。
图示1:一个包含“Search”(查找)操作按钮和额外操作的操作栏。额外操作可以显示更多的可用操作。
通过XML设置操作
所有的操作按钮以及在额外操作中的项都是在一个XML菜单资源(menu resource)文件中定义的。要在操作栏中添加操作,在“/res/menu”目录中创建一个新的XML文件。
为每个你想包含在操作栏中的项添加一个“<item>”元素。比如:
res/menu/main_activity_actions.xml
<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>
以上代码声明了当操作栏上有空间的时候,搜索操作应该作为一个操作按钮显示在操作栏上,然而,设置操作(settings)应总在额外操作中显示。(缺省情况下,所有操作都显示在额外操作中,但是,为每个操作声明你的设计意向是良好的习惯做法。)
“icon”(图标)属性需要一个图像资源的资源ID。在“@drawable/”后面的名字,必须是一个你已经保存在项目“res/drawable/”目录下的位图文件的名字。比如,“@drawable/ic_action_search”表示“ic_action_search.png”。类似的,“title”(标题)属性使用一个在“res/values”目录中,通过XML文件定义的字符串资源,就像我们在“建立一个简单的用户界面”中讨论过的那样。
下载操作栏图标
为了尽可能符合Android的图标规范(iconography guidelines),你应该使用“Action Bar Icon Pack”中提供的图标。
注意:当为你的应用创建图标或其他位图图片资源时,针对不同分辨率屏幕创建各自的优化版本是非常重要的。这在“Supporting Different Screens”课程中将更详细的讨论。
如果你的应用为了兼容Android 2.1等低版本而是用了“Support Library”,“showAsAction”属性不存在于“android:”命名空间。却而代之的,“Support Library”提供了此属性。因此,你必须定义你自己的XML命名空间,然后使用此命名空间作为属性的前缀。(一个自定义XML命名空间应该基于你的应用的名字,但是,你可以使用任何你想使用的名字。这个命名空间只在你定义它的文件中有效)例如:
res/menu/main_activity_actions.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>
向操作栏中添加操作
要将菜单项添加到操作栏,需要在你的activity中实现“onCreateOptionsMenu()”方法,以将菜单资源填充(inflate,译者注:这个是Android开发中的常用词汇,意思是将一个XML资源描述转化为一个真正的可用对象。一般是与视图相关的资源。在Android的相关API中,有专门的方法叫做inflate())到提供的菜单(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对应你在相应的“<item>”元素中所声明的“android: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添加“向上”按钮
在所有不是应用入口的屏幕中(不是“home”屏幕的activity),都应该通过点击菜单栏的向上按钮的方式,提供用户一个能够导航到基于应用层次结构的父屏幕的方法。
图示4:Gmail应用中的“向上”按钮
当在Android 4.1(API level 16)或者更高版本中,或者当使用“Support Library”中的“ActionBarActivity”类时,执行“向上”导航操作,只需要你简单的在manifest文件中声明父activity并且启用操作栏的向上按钮。
例如,下面代码展示如何在manifest文件中声明父activity:
<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 Open Source Project的文档。依照Creative Commons 2.5 Attribution License使用并分享。此文章(译文,中文)原始链接为“[安卓教学] 添加操作栏(Action Bar) - 第二课 - 添加操作按钮”。原文(英文)链接为“Adding Action Buttons”。
< 上一课 | 课程介绍 | 下一课 > |