Android轩辕剑之ActionBar之一
传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229
Action Bar是一个能用于确定应用程序和用户的位置,并提供给用户操作和导航模式的窗口功能。如果需要显著地展示当前用户的操作或导航,应该使用Action Bar,因为Action Bar为用户提供了一个统一的跨应用程序和系统的接口,并且针对不同尺寸的屏幕优雅的处理了Action Bar的适配。你可以通过ActionBar API来控制它的行为和可视性,这些API添加于Android 3.0(API级别为11)。
1设计目的
1.1提供一个专门的空间来确定应用程序的标识和用户的位置。
这是在应用程序图标或者是左侧的logo以及Activity的标题帮助下完成的。如果当前视图的导航标签被标识,例如当前选项卡选中,你可能会选择删除该Activity名称。1.2提供统一的导航和视图细化到不同的应用程序中。
Action Bar提供了内置选项卡导航来进行在fragments之间切换。它还提供了一个下拉列表中,可以来用来替代导航模式或用来完善当前视图(比如按照不同的标准来排序列表)。1.3突出Activity的关键动作(如“搜索”、“创建”、“共享”,等),便于用户一个可预测的访问。
对于关键的用户操作,你可以通过将item从选项菜单直接在操作栏定义为action items来提高访问速度。action items也可以提供一个“action view”,它用一个嵌入式widget来提供更多及时的动作行为。没有晋升为成action items的菜单项在溢出菜单中还是有效的,用户既可以使用设备上的菜单按钮(设备上有按钮的时候),也可以使用Action Bar中的溢出菜单按钮(当设备上不包含菜单按钮时)。2添加Action Bar
从Android3.0(API level 11)开始,Action Bar包括在所有Activity中使用的Theme.Holo主题(或是继承Activity的一个子类),这是当targetSdkVersion或minSdkVersion属性设置为“11”或更高时程序默认的主题。<manifest ... > <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="11" /> ... </manifest>
在这个例子中,应用程序设置的最低版本的API Level为4(Android 1.6),但它目标API级别为11(Android 3.0)。通过这样设置,当应用程序运行在Android 3.0或更高版本上时,系统为每个Activity应用Holo主题,因此,每一个Activity都包含Action Bar。如果你想使用Action Bar的API,比如添加导航模式和修改操作栏样式,你应该设置minSdkVersion为“11”或是更高的版本。如果你想你的应用程序支持旧版本的Android,有很多办法可以让低版本的ActionBar的API的在支持API级别为11或更高的设备上,同时仍运行旧版本。
2.1移除Action Bar
如果你不想为一个特定的Activity设置Action Bar,那么可以设置Activity主题为Theme.Holo.NoActionBar。<activity android:theme="@android:style/Theme.Holo.NoActionBar">
2.2隐藏Action Bar
也可以在运行时通过调用hide()隐藏Action Bar。ActionBar actionBar = getActionBar(); actionBar.hide();当Action Bar隐藏时,系统会调整Activity的布局来填充所有可用屏幕空间。当然你可以通过调用show()显示Action Bar。 隐藏和删除Action Bar可能会使Activity重新调整布局。如果你的Activity经常隐藏和显示Action Bar(如在Android的画廊应用),你可能想用覆盖(Overlay)模式。覆盖模式布局在Activity的上层,而不是在同一层下的Activity的顶部。这样,你的布局可以在Action Bar隐藏和重新出现时保持不变。要启用覆盖模式,创建Activity主题并且将android:windowActionBarOverlay属性值设置为true。注意:如果你有一个自定义的的Activity主题并且想在其中删除Action Bar,然后把android:windowActionBar样式属性设置为false。,那么,由于你移除了Action Bar正在使用的主题,那么getActionBar()方法将返回null,当你和系统调用此方法的时候就会出现问题。
3添加Action Items
有时你可能想让用户从选项菜单(options menu)中直接访问item。要做到这一点,你可以声明该菜单项为Action Bar中的一个“action item”。一个“action item”包括一个图标和/或文字标题。如果一个菜单项不作为一个“action item”,系统会将菜单项放置在溢出菜单。溢出菜单显示设备菜单“按钮(如果设备提供)或在操作栏中的按钮(如果设备不提供”菜单“按钮)。首次启动Activity时,系统通过在activity调用onCreateOptionsMenu()方法来填充action bar和溢出菜单(overflow menu)。在菜单开发指南中讨论的,它是在这个回调方法,你应该在inflate一个XML定义菜单项的菜单资源。@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_activity, menu); return true; }
在XML文件中,你可以通过声明android:showAsAction="ifRoom" 让菜单item成为action item。通过这种方式,当有可用空间时,菜单项才会出现在action item的快速访问栏。如果没有足够的空间,该item将出现在溢出菜单。如果你的菜单项同时提供标题和图标--同时具有Android:titile和android:icon属性,action item默认只会显示图标。但如果你想显示文字标题,必须添加“withText”到Android:showAsAction属性中。
<?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”值应用用于一个Action Bar的提示文本出现。但如果一个图标无法使用或者空间受限,action bar的标题可能无法显示。
当用户选择一个action item,activity调用一个OptionsItemSelected()方法,通过android:id属性获取的ID值来接收在选项菜单中的所有item中相同的回调。 这一点很重要,你总是为每个菜单项定义android:title,你不在显示的action item中声明标题的理由有三个:
如果在action bar中没有足够的空间提供给action item,该菜单项出现溢出“菜单中,而且只有标题显示。
屏幕阅读器为视障用户读出菜单项的标题。
如果action item只有图标,用户可以长按item显示的工具提示,显示action item的标题。
Android的图标始终是可选的。
你也可以定义一个item“always”为action item,以避免当空间有限时被放到溢出菜单中去。但在大多数情况下,不应该设置“always”这个值来强制使一个item出现在action bar中。要注意的是过多的action item,会导致创建出来的UI杂乱不堪,并且在窄屏幕的设备上会出现布局问题。最好使用“ifRoom”,在没有足够的空间时,应允许系统将它移动到溢出菜单。
3.1选项你的Action items
你应该应通过评估的几个关键特性,仔细从选项菜单中选出action item。在一般情况下,每个action item,至少有以下需求之一:3.1.1常用性:用户70%的时间需要访问或需要连续多次使用。常用性例子:在短信息应用程序的“新信息”和Google Player中的“搜索(Search)”。
3.1.2重要性:用户能够很容易地发现,或者如果不经常使用,在少数情况用户确实需要它的时候,可以毫不费力地执行,这一点是很重要的。重要性例子:在 Wi-Fi设置“加入网络”和在画廊(Gallery)应用程序中“切换到相机”。
3.1.3典型性:这是一个通常在类似的应用程序的action bar中提供的action,因此,用户希望自己找到它。典型性例子:电子邮件应用中的“刷新”和电话本应用中的“新的联系人”。
如果你认为四个以上菜单项可以合理的作为action item,那么你应该仔细考虑其相对等级的重要性,并尽量设置不超过四个的菜单项的action item(这样设置“ifRoom”这个值,在一些空间有限的小屏幕上,系统把一些菜单项放到溢出菜单背面)。即使是宽屏幕上,你也不要创建一个杂乱的UI的action item,冗长得看起来像一个桌面工具栏,应该要使action item的数量保持到最低限度。 此外,下列行为不应该出现行动项目中:类似设置,帮助,反馈,或查找,始终将这些放在溢出菜单中。
3.2使用分离(split)的Action Bar
当你的应用程序运行在Android 4.0系统(API Level 14)或更高时,还有一个额外的模式可称action bar为“split action bar”。当在一个狭窄的屏幕运行启用split action bar时,会在屏幕的底部出现一个action bar显示所有action item。split action bar用来分开action item,确保分配合理数量的空间来在一个狭窄的屏幕上显示所有的action item,而空间留给顶端的导航和标题元素。 使用 split action bar,只需添加uiOptions=“splitActionBarWhenNarrow”,到你的<activity>或<application> manifest中。要知道Android在各种不同的方式,根据当前的屏幕大小调整action bar的外观。采用split action bar只是一个选项,您可以启用允许action bar进一步为不同的屏幕尺寸,优化用户体验。这样做,你也可以让action bar可以折叠成主要的action bar的导航标签(navigation tabs)。也就是说,如果你在你的action bar中使用的导航标签,一旦action items狭窄的屏幕上分离,导航标签可以融入的主要action bar,而不是被分隔成的“折叠的action bar”。具体来说,如果你禁用action bar中的图标和标题(setDisplayShowHomeEnabled(false)和setDisplayShowTitleEnabled(false)),然后将主要action bar的导航标签相互重叠。