操作栏的主要目的是:
1. 为了标识应用程序的商标和用户的位置而提供的一个专用空间。
这个空间的左边是应用的图标或logo,以及Activity的标题。但是,如果是像当前选择的标签这样的标识当前View对象的导航标签,你可以选择删除Activity的标题。
2. 在不同的应用程序之间提供一致的导航和视觉体验。
操作栏提供了用于Fragment间切换的内置导航标签。它还提供了一个用于替换导航模式或优化当前视觉效果(如按照不同条件排序的列表)的下拉列表。
3. 突出Activity的关键操作(如“搜索”、“创建”、“共享”,等),并且在可预见的方法内给用户提供快捷的访问。
对于关键的用户操作,你能够通过把选项菜单项作为操作项直接放到操作栏中,从而提供快捷的访问。操作项目还能提供一个操作窗口,这个窗口给更直接的操作行为提供一个嵌入的窗口部件。没有改进成操作项的菜单项在溢出菜单中还是有效的,用户既可以使用设备上的菜单按钮(设备上有按钮的时候),也可以使用操作栏中的溢出菜单按钮(当设备上不包含菜单按钮时)来显示这些操作项目。
图1. Honeycomb Gallery应用中的操作栏,从左边开始,依次是logo、导航选项标签和操作项(在右边插入的一个溢出菜单按钮)。
注意:如果你在查找有关上下文操作栏的信息,请看“菜单”指南。
添加操作栏
从Android3.0(API级别 11)开始,操作栏被包含在所有的使用Theme.Hole主题的Activity(或者是这些Activity的子类)中,当targetSdkVersion或minSdkVersion属性被设置为“11”或更大的数值是,这个主题是默认的主题一。如:
...
在这个例子中,应用程序要求最小的API版本级别是4(Android 1.6),但是它还要求了目标API版本级别是11(Android 3.0)。这样,当应用程序运行在Android3.0或更高的版本上时,系统就会给每个Activity应用全景主题,这样,每个Activity就会包含操作栏。
如果你想使用ActionBar API来进行添加导航模式和修改操作栏样式的操作,你应该把minSdkVersion属性设置为“11”或更大的值。如果想要你的应用程序支持更旧的Android版本,那么在支持API 级别 11或更高版本,但却依然运行着旧的Android版本的设备上,就要使用受限受限droid如果你运行咋是默认的主题一、。在溢出菜单中是有效的的ActionBar API集。
删除操作栏
对于特殊的Activity,如果你不想要操作栏,把Activity的主题设置为Theme.Holo.NoActionBar就可以了,如:
你也能够通过调用hide()方法在运行时隐藏操作栏,如:
ActionBar actionBar = getActionBar();
actionBar.hide();
当操作栏隐藏时,系统会调整你的Activity来填充当前有效的屏幕空间。你能够使用show()方法来再次显示操作栏。
在隐藏和删除操作栏时,要当心为了适应被操作栏占用的空间而导致的Activity的重新布局。如果你的Activity有规律的隐藏和显示操作栏,你可能想要使用覆盖模式。覆盖模式在Activity的顶部描画操作栏,而不是在它们所拥有的屏幕的区域。这样,在操作栏隐藏和重新显示时,你的布局保持不变。要使用覆盖模式,就要给Activity创建一个主题,并且把android:windowActionBarOverlay属性设置为true。
提示:如果你有一个删除了操作栏的定制化的Activity主题,它把android:windowActionBar样式属性设置为false。但是,如果你使用了删除操作栏的一个主题,那么,创建窗口将不允许操作栏再显示,因此,你不能在以后给这个Activity添加操作栏---因为getActionBar()方法将返回null。
添加操作项
有些时候,你可能想要让用户直接访问选项菜单中的一个项目,因此你要把应该在操作栏中显示的菜单项作为一个操作项来声明。操作项能够能够包含一个图标或文本标题。如果一个菜单项不作为一个操作项显示,那么系统就会把它放到溢出菜单中。溢出菜单既可以通过设备的Menu按钮来显示,也可以操作栏中一个额外的按钮来显示。
当Activity首次启动时,系统会调用onCreateOptionsMenu()方法给你的Activity组装操作栏和溢出菜单。在这个回调方法中应该加载在XML文件中定义的菜单项资源,如:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity, menu);
return true;
}
图2. 带有图标和文本标题的两个操作项,和溢出菜单按钮。
在XML文件中,你能够通过给
如果你的菜单项支持标题和图标---带有android:title和android:icon属性---那么默认情况下,操作项仅显示图标。如果你要显示文本标题,就要给android:showAsAction属性添加withText设置,如:
注意:withText值示意操作栏要显示文本标题。操作栏会尽可能的显示这个标题,但是,如果图标有效并且受到操作栏空间的限制,文本标题有可能显示不全。
当用户选择了一个操作项时,Activity会接收一个onOptionsItemSelected()的回调,要把android:id属性支持的ID传递给这个方法。
给每个菜单项定义android:title属性是至关重要的,即使你没有给操作项声明标题。原因如下:
1. 如果操作栏中没有足够的空间来显示操作项,那么菜单项就会显示在溢出菜单中,并仅显示标题;
2. 屏幕阅读器要给视障用户朗读菜单项标题;
3. 如果仅用图标来显示操作项,那么,用户能够长按这个项目,用操作项的标题来显示提示信息。
注意:如果你添加源于Fragment对象的菜单项,那么通过Fragment类的onCreateOptionsMenu回调方法,当用户选择其中一个Fragment菜单项时,系统会对用那个Fragment对象对应的onOptionsItemSelected()方法。但是,Activity有机会首先处理这个事件,因为系统在调用对应的Fragment对象的onOptionsItemSelected()方法之前会调用Activity的相同的回调方法。
你也能够声明一个菜单项,让它始终作为操作项来显示,而不是在空间不足时就放到溢出菜单中。大多数情况下,你不应该使用always属性值来强制一个菜单项始终显示在操作栏中,但是,当提供了一个不给溢出菜单提供默认操作的操作窗口时,你就需要始终显示一个菜单项。但是要警惕,太多的操作项会创建一个混乱的UI,并且会导致窄屏设备上的布局问题。最好的方法是使用ifRoom属性值,它允许系统在操作栏空间不足的时候,把菜单项移到溢出菜单中。