添加动作按钮
动作栏允许你将重要的动作选项直接放到上面。这些选项可以以图标加文本或纯文本的形式显示在动作栏里,这些选项称作动作按钮。如果按钮不能全部显示出来,或者不需要直接显示的话,他们会被放在“更多”选项里(也就是下图中的上下3个点的按钮)。
Figure 1. An action bar withan action button for Search and the action overflow, which reveals additionalactions
在XML中指定动作
所有的动作按钮包括显示在“更多”选项里的都被定义在菜单资源里。为了在动作栏里添加动作,在你的项目文件夹res/menu/下创建一个XML文件。
针对每一个添加到动作栏的动作,相应地在文件中添加一个<item>,如下:
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"
android:showAsAction="ifRoom" />
<!—设置,显示在“更多”选项里 -->
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:showAsAction="never" />
</menu>
上面声明了当动作栏空间足够的话,就将搜索选项作为动作按钮显示在动作栏上。设置选项显示在“更多”选项里。(默认情况下,所有选项都会显示在“更多”选项里)。
icon属性需要指定一个图片资源ID。紧跟在@drawable/后面的名字必须是你工程文件夹res/drawable下的某一个图片的名字。例如,”@drawable/ic_action_search”指向ic_action_search.png。同样的,title使用的字符串应当定义在res/values文件夹下,在之前的课程中我们已经有过类似介绍。
注意:当创建图标或者图片的时候,应当注意适配不同的屏幕密度使用不同大小的图片。这个问题会在以后的课程中讲到。
如果你的app在较低的安卓2.1以上版本使用了支持库,那么android:命名空间里没有showAsAction属性定义。这个属性定义是由支持库提供的,你必须自己定义一个XML命名空间,然后使用这个空间名作为属性前缀使用。(一个自定义的命名空间应该基于你的APP名字,但是实际上你可以随意起名,它只在此文件中有效。)如下:
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(),把菜单填充到参数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值与你在XML中声明的<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添加向上按钮
(个人看法,当你从activity A进入activity B,那么相对A来说,B就是下层的,就是这么简单的概念。)你的app里总存在着一些不是主入口的界面,也就是说,最开始是从主界面一步一步引导进来的,那么应该提供一个返回父界面(也即上层界面,就是从B返回到A)的方式,动作栏通过提供“向上”按钮来帮助你实现。(“向上”按钮就是下图中的< 左箭头)
Figure 4. The Up button in Gmail.
当运行在安卓4.1(API 16)或者更高的版本上,或者使用支持库里的ActionBarActivity,实现“向上”导航功能需要你做简单的两件事,第一就是在配置文件中声明父activity,第二就是在代码中使动作栏的向上导航功能变为可用。
例如,下面就是一个在配置文件中声明父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>
为了使APP图标变成一个“向上”按钮,可以调用方法setDisplayHomeAsUpEnabled():
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_displaymessage);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// 如果你 minSdkVersion 是 11或者更大, 应写成下面的形式:
// getActionBar().setDisplayHomeAsUpEnabled(true);
}
因为系统知道MainActivity是DisplayMessageActivity的父Activity。当用户点击“向上”按钮的时候,系统就会导航到父activity界面---你不需要处理这个事件。
关于导航的更多细节,请参考 Providing Up Navigation。(将来或许会翻译^_^)