操作栏允许你为与应用的当前上下文相关的大多数重要的操作项添加按钮。那些直接在操作栏上出现的有一个图标和/或文本的按钮被认为是操作按钮。操作栏上放不下或不够重要的操作隐藏在更多操作中。
图 1. 一个拥有 Search 操作按钮和更多操作(显示另外的操作)的操作栏。
在 XML 中指定操作
所有操作按钮和更多操作中的其他可用项都在一个 菜单资源 XML 中定义。为了在操作栏上添加操作,在你的工程的 res/menu/
目录下创建一个新的 XML 文件。
为你想包含在操作栏中的每个项添加一个 <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>
这声明当操作栏空间可用时 Search 操作作为一个操作按钮出现,但 Settings 操作应该总是在更多操作中出现。(默认情况下,所有操作都在更多操作中出现,但是显式地为每个操作声明你的设计意图是很好的实践。)
icon
属性需要一个图像的资源 ID。@drawable/
后跟着的名称必须是你在你的工程的res/drawable/
目录下保存的一个位图图像的名称。例如,"@drawable/ic_action_search"
引用ic_action_search.png
。 同样地,title
属性使用一个在你的工程的res/values/
目录下的一个 XML 文件中定义的字符串资源,就像开发简单的用户界面 中所讨论的。
注意:当为你的应用创建图标和其他位图图像时,你需要提供为不同的屏幕密度优化的多个版本,这点很重要。更多内容在 支持不同屏幕 课程中讨论。
如果为了兼容低至安卓 2.1版本,你的应用使用支持库,showAsAction
属性在android:
命名空间中不可用。作为支持库提供的这个属性的替代,你必须定义你自己的 XML 命名空间并用它作为这个属性的前缀。(一个自定义的 XML 命名空间需要基于你的应用的名称,但它可用是你想用的任何名称,并且这个名称只在你声明它的那个文件中可用。)例如:
<menu xmlns:android="http://schemas.android.com/apk/res/android" <strong>xmlns:yourapp="http://schemas.android.com/apk/res-auto"</strong> > <!-- Search, should appear as action button --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" <strong>yourapp:showAsAction="ifRoom"</strong> /> ... </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 与你给对应的<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 添加向上按钮
图 4. Gmail中的向上按钮。
如果你的应用的所有屏幕都不是主入口(所有 activity 都不是 "首页" 屏幕) ,你需要提供用户一种方法让他通过按 操作栏的向上按钮导航到应用层次结构中的逻辑父屏幕。
当运行在安卓 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>
然后通过调用 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—你不需要处理向上按钮的事件。
更多关于向上导航的信息,参见 提供向上导航。