`
bcyy
  • 浏览: 1826174 次
文章分类
社区版块
存档分类
最新评论

Android 用户界面---操作栏(Action Bar 一)

 
阅读更多
操作栏是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的需要突出展现用户操作或全局导航的Activity中,你应该使用操作栏,因为操作栏能够跨应用程序给用户提供一致的界面,并且系统能够很好根据不同的屏幕配置来适应操作栏的外观。你能够用ActionBar的对象的API来控制操作栏的行为和可见性,这些API被添加在Android3.0(API 级别 11)中。

操作栏的主要目的是:

1.为了标识应用程序的商标和用户的位置而提供的一个专用空间。

这个空间的左边是应用的图标或logo,以及Activity的标题。但是,如果是像当前选择的标签这样的标识当前View对象的导航标签,你可以选择删除Activity的标题。

2.在不同的应用程序之间提供一致的导航和视觉体验。

操作栏提供了用于Fragment间切换的内置导航标签。它还提供了一个用于替换导航模式或优化当前视觉效果(如按照不同条件排序的列表)的下拉列表。

3.突出Activity的关键操作(如“搜索”、“创建”、“共享”,等),并且在可预见的方法内给用户提供快捷的访问。

对于关键的用户操作,你能够通过把选项菜单项作为操作项直接放到操作栏中,从而提供快捷的访问。操作项目还能提供一个操作窗口,这个窗口给更直接的操作行为提供一个嵌入的窗口部件。没有改进成操作项的菜单项在溢出菜单中还是有效的,用户既可以使用设备上的菜单按钮(设备上有按钮的时候),也可以使用操作栏中的溢出菜单按钮(当设备上不包含菜单按钮时)来显示这些操作项目。

图1. Honeycomb Gallery应用中的操作栏,从左边开始,依次是logo、导航选项标签和操作项(在右边插入的一个溢出菜单按钮)。

注意:如果你在查找有关上下文操作栏的信息,请看“菜单”指南。

添加操作栏

从Android3.0(API级别 11)开始,操作栏被包含在所有的使用Theme.Hole主题的Activity(或者是这些Activity的子类)中,当targetSdkVersion或minSdkVersion属性被设置为“11”或更大的数值是,这个主题是默认的主题一。如:

<manifest ... >
    <uses-sdk android:minSdkVersion="4"
              android:targetSdkVersion="11" />
    ...
</manifest>

在这个例子中,应用程序要求最小的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就可以了,如:

<activity android:theme="@android:style/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;
}

pic

图2. 带有图标和文本标题的两个操作项,和溢出菜单按钮。

在XML文件中,你能够通过给<item>元素声明android:showAsAction=”ifRoom”s属性,请求把一个菜单项作为一个操作项来显示。用这种方式,只在有有效的空间时,菜单项才能显示在操作栏中。如果没有足够的空间,这个菜单项会显示在溢出菜单中。

如果你的菜单项支持标题和图标---带有android:title和android:icon属性---那么默认情况下,操作项仅显示图标。如果你要显示文本标题,就要给android:showAsAction属性添加withText设置,如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_save"
          android:icon="@drawable/ic_menu_save"
          android:title="@string/menu_save"
          android:showAsAction="ifRoom|withText" />
</menu>

注意:withText值示意操作栏要显示文本标题。操作栏会尽可能的显示这个标题,但是,如果图标有效并且受到操作栏空间的限制,文本标题有可能显示不全。

当用户选择了一个操作项时,Activity会接收一个onOptionsItemSelected()的回调,要把android:id属性支持的ID传递给这个方法。

给每个菜单项定义android:title属性是至关重要的,即使你没有给操作项声明标题。原因如下:

1.如果操作栏中没有足够的空间来显示操作项,那么菜单项就会显示在溢出菜单中,并仅显示标题;

2.屏幕阅读器要给视障用户朗读菜单项标题;

3.如果仅用图标来显示操作项,那么,用户能够长按这个项目,用操作项的标题来显示提示信息。

注意:如果你添加源于Fragment对象的菜单项,那么通过Fragment类的onCreateOptionsMenu回调方法,当用户选择其中一个Fragment菜单项时,系统会对用那个Fragment对象对应的onOptionsItemSelected()方法。但是,Activity有机会首先处理这个事件,因为系统在调用对应的Fragment对象的onOptionsItemSelected()方法之前会调用Activity的相同的回调方法。

你也能够声明一个菜单项,让它始终作为操作项来显示,而不是在空间不足时就放到溢出菜单中。大多数情况下,你不应该使用always属性值来强制一个菜单项始终显示在操作栏中,但是,当提供了一个不给溢出菜单提供默认操作的操作窗口时,你就需要始终显示一个菜单项。但是要警惕,太多的操作项会创建一个混乱的UI,并且会导致窄屏设备上的布局问题。最好的方法是使用ifRoom属性值,它允许系统在操作栏空间不足的时候,把菜单项移到溢出菜单中。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics