Android 用户界面操作栏Action BarWord下载.docx
《Android 用户界面操作栏Action BarWord下载.docx》由会员分享,可在线阅读,更多相关《Android 用户界面操作栏Action BarWord下载.docx(27页珍藏版)》请在冰点文库上搜索。
<
uses-sdkandroid:
minSdkVersion="
4"
android:
targetSdkVersion="
11"
/>
...
/manifest>
在这个例子中,应用程序要求最小的API版本级别是4(Android1.6),但是它还要求了目标API版本级别是11(Android3.0)。
这样,当应用程序运行在Android3.0或更高的版本上时,系统就会给每个Activity应用全景主题,这样,每个Activity就会包含操作栏。
如果你想使用ActionBarAPI来进行添加导航模式和修改操作栏样式的操作,你应该把minSdkVersion属性设置为“11”或更大的值。
如果想要你的应用程序支持更旧的Android版本,那么在支持API级别11或更高版本,但却依然运行着旧的Android版本的设备上,就要使用受限受限droid如果你运行咋是默认的主题一、。
在溢出菜单中是有效的的ActionBarAPI集。
删除操作栏
对于特殊的Activity,如果你不想要操作栏,把Activity的主题设置为Theme.Holo.NoActionBar就可以了,如:
activityandroid:
theme="
@android:
style/Theme.Holo.NoActionBar"
>
你也能够通过调用hide()方法在运行时隐藏操作栏,如:
ActionBaractionBar=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
publicbooleanonCreateOptionsMenu(Menumenu){
MenuInflaterinflater=getMenuInflater();
inflater.inflate(R.menu.main_activity,menu);
returntrue;
}
图2.带有图标和文本标题的两个操作项,和溢出菜单按钮。
在XML文件中,你能够通过给<
item>
元素声明android:
showAsAction=”ifRoom”s属性,请求把一个菜单项作为一个操作项来显示。
用这种方式,只在有有效的空间时,菜单项才能显示在操作栏中。
如果没有足够的空间,这个菜单项会显示在溢出菜单中。
如果你的菜单项支持标题和图标---带有android:
title和android:
icon属性---那么默认情况下,操作项仅显示图标。
如果你要显示文本标题,就要给android:
showAsAction属性添加withText设置,如:
?
xmlversion="
1.0"
encoding="
utf-8"
menuxmlns:
android="
itemandroid:
id="
@+id/menu_save"
icon="
@drawable/ic_menu_save"
title="
@string/menu_save"
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属性值,它允许系统在操作栏空间不足的时候,把菜单项移到溢出菜单中。
选择操作项
通过评估一些关键的特性,你应该仔细的选择选项菜单中的那些菜单项应该作为操作项来显示,通常,每个操作项应该至少满足下列特性之一:
1.经常使用:
用户百分之七十以上的访问都需要使用的操作,或者是要连续的多次使用的操作。
2.重要:
它是一个用户能够很容易找到的操作,即使它不是经常性的操作,也需要用户在需要的时候能够轻易的找到它,并执行。
如,Wi-Fi设置中的添加网络等。
3.典型:
它是一些类似应用程序的操作栏中提供的典型操作,因此,用户都期望在操作栏中能够找到它。
如,电子邮件或社交应用程序中的“刷新”操作。
如果你想要把四个以上的菜单项调整为操作项,那么你就应该认真考虑一下他们相对的重要性级别,并且尝试不要超过四个以上的操作项设置(并且还有使用“ifRoom”属性值的设置,允许系统在遇到空间受限的比较小的屏幕的时候,能够把靠后的操作项放到溢出菜单中)。
即使在一些宽屏设备上,空间充足,你也不应该创建很多操作项,这样会扰乱UI的布局,而且更像一个桌面工具栏,因此要保持最小数量的操作项。
另外,以下操作应该永远不要作为操作项来显示:
设置、帮助、意见反馈、或类似的操作。
要把它们始终保留在溢出菜单中。
不是所有的设备都给检索提供了专有的硬件按钮,因此,如果是你应用程序中的一个重要功能,它应该始终作为一个操作项来显示(而且通常要把放到第一项的位置,尤其是操作窗口中提供这个操作的时候)。
使用分离式操作栏
当你的应用程序正在Android4.0(API级别14)或以上的版本上运行,那么还有一种叫做“分隔操作栏”的额外模式对操作栏有效。
当你启用分隔操作栏模式时,在屏幕的底部会显示一个独立的横条,用于显示Activity在窄屏设备(如竖屏手机)上运行时的所有操作项。
把操作栏分隔成独立的操作项,确保在窄屏设备上有合适的空间来显示所有的操作项,同时把导航条和标题元素留在顶部。
要启用分离式操作栏,只需简单的在<
application>
或<
activity>
元素中添加uiOptions=”splitActionBarWhenNarrow”属性设置就可以了。
要注意,Android会基于当前屏幕的尺寸用各种方式来调整操作栏的外观。
使用分离式操作栏只是你能够启用的允许操作栏针对不同屏幕尺寸来进一步优化用户体验的选项之一。
你还可以允许操作栏把导航选项标签折叠到主操作栏中,如果你在操作栏中使用导航选项标签,那么一旦操作项在窄屏设备上被分离,这些导航选项标签就可能填充到主操作栏中,而不是被分离到堆叠起来的操作栏。
尤其是如果你禁用了操作栏的图标和标题(用setDisplayShowHomeEnabled(false)和setDisplayShowTitleEnabled(false)方法),那么导航选项标签就会折叠到主操作栏中,如下图3中第二个设备的显示:
图3.左侧是带有导航选项标签的分离式操作栏,右侧是禁用了应用图标和标题的分离式操作栏。
尽管android:
uiOptions属性在Android4.0(API级别14)中才被添加,但是为了保持跟Android的低版本的兼容性,即使你的minSdkVersion属性值小于14,那么你的应用程序也可以安全的包含android:
uiOptions属性。
在旧版本上运行时,因为系统不能理解这个属性,所以只是简单的忽略了这个XML属性。
在你的清单文件中包含这个属性的唯一条件是,你必须在支持API级别14或更高以上版本的平台上编译你的应用程序。
为了保持兼容性,你不能在你的应用程序代码中使用由minSdkVersion属性声明的版本所不支持的API,只有XML属性才能被旧的平台版本安全的忽略。
使用应用程序图标来导航
默认情况下,应用程序图标显示在操作栏的左边。
你能够把这个图标当做操作项来使用。
应用程序应该在这个图标上响应以下两个操作之一:
1.返回应用程序的“主”Activity;
2.向应用程序上级页面导航。
当用户触摸这个图标时,系统会调用Activity带有android.R.id.homeID的onOptionsItemSelected()方法。
在这个响应中,你既可以启动主Activity,也可以返回你的应用程序结构化层次中用户上一步操作的界面。
如果你要通过应用程序图标的响应来返回主Activity,那么就应该在Itent对象中包括FLAG_ACTIVITY_CLEAR_TOP标识。
用这个标记,如果你要启动的Activity在当前任务中已经存在,那么,堆栈中这个Activity之上的所有的Activity都有被销毁,并且把这个Activity显示给用户。
添加这个标识往往是重要的,因为返回主Activity相当与一个回退的动作,因此通常不应该再创建一个新的主Activity的实例,否则,最终可能会在当前任务中产生一个很长的拥有多个主Activity的堆栈。
例如,下例的onOptionsItemSelected()方法实现了返回应用程序的主Activity的操作:
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId()){
caseandroid.R.id.home:
//appiconinactionbarclicked;
gohome
Intentintent=newIntent(this,HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
default:
returnsuper.onOptionsItemSelected(item);
}
在用户从另一个应用程序进入当前Activity的情况下,你可能还想要添加FLAG_ACTIVITY_NEW_TASK标识。
这个标识确保在用户返回主页或上级页面时,新的Activity不会被添加到当前的任务中,而是在属于你自己的应用程序的任务中启动。
例如,如果用户通过被另一个应用程序调用的Intent对象启动了你的应用程序中的一个Activity,那么选择操作栏图标来返回主页或上级页面时,FLAG_ACTIVITY_CLEAR_TOP标识会在属于你的应用程序的任务中启动这个Activity(不是当前任务)。
系统既可以用这个新的Activity做根Activity来启动一个新的任务,也可以把存在后台的拥有这个Activity实例的一个既存任务带到前台来,并且目标Activity会接受onNewIntent()回调。
因此,如果你的Activity要接收另一个应用程序的Intent对象,那么通常应该给这个Intent对象添加FLAG_ACTIVITY_NEW_TASK标识,如:
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
如果你要使用应用图标来返回主页,要注意从Android4.0(API级别14)开始,必须通过调用setHomeButtonEnabled(true)方法确保这个图标能够作为一个操作项(在以前的版本,默认情况下,这个图标就能够作为一个操作项)。
向应用程序上级页面导航
作为传统的回退导航(把用户带回任务历史中的前一个窗口)的补充,你能够让操作栏图标提供向上级页面导航的功能,它应用把用户带回到你的应用程序的上级页面。
例如,当前页面时你的应用程序层次比较深的一个页面,触摸应用程序图标应该返回返回上一级页面(当前页面的父页面)。
图4.Email应用程序的标准图标(左)和向上导航图标(右)。
系统会自动添加向上指示。
例如,图5演示了当用户从一个应用程序导航到一个属于不同应用程序的Activity时,“回退”按钮的行为。
图5.在从People(或Contacts)应用程序进入Email应用程序之后,回退按钮的行为。
但是,如果在编辑完邮件之后,想要停留在Email应用程序中,那么向上导航就允许你把用户导航到Email应用程序中编辑邮件页面的上级页面,而不是返回到前一个Activity。
图6演示了这种场景,在这个场景中,用户进入到Email应用程序后,不是按回退按钮,而是按操作栏图标来向上导航。
图6.从People应用进入Email应用后,向上导航的行为。
要是应用程序图标能够向上导航,就要在你的ActionBar中调用SetDisplayHomeAsUpEnabledtrue(true)方法。
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBaractionBar=getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
当用户触摸这个图标时,系统会调用带有android.R.id.homeID的onOptionsItemSelected()方法。
请集中要在Intent对象中使用FLAG_ACTIVITY_CLEAR_TOP标识,以便你不会这个父Activity存在的情况下,再创建一个新的实例。
例如,如果你不使用FLAG_ACTIVITY_CLEAR_TOP标识,那么向上导航后,再按回退按钮,实际上会把用户带到应用程序的下级页面,这是很奇怪的。
如果有很多用户能够到达应用程序中当前Activity的路径,那么,向上图标应该沿着当前Activity的实际启动路径逐步的向会导航。
添加操作视窗
操作视窗是作为操作项目按钮的替代品显示在操作栏中的一个可视构件。
例如,如果你有一个用于搜索的可选菜单项,你可以用SearchView类来替代操作栏上的搜索按钮,如图7所示:
图7.折叠(上)和展开(下)的搜索视窗的操作栏
要个菜单资源中的一个项目声明一个操作视窗,你既可以使用android:
actionLayout属性也android:
actionViewClass属性来分别指定一个布局资源或要使用的可视构件类。
例如:
@+id/menu_search"
android:
@string/menu_search"
@drawable/ic_menu_search"
ifRoom|collapseActionView"
actionViewClass="
android.widget.SearchView"
android:
showAsAction属性也可包含“collapseActionView”属性值,这个值是可选的,并且声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。
否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。
如果需要给操作视窗添加一些事件,那么就需要在onCreateOptionsMenu()回调执行期间做这件事。
你能够通过调用带有菜单项ID的findItem()方法来获取菜单项,然后再调用getActionView()方操作视窗中的元素。
例如,使用以下方法获取上例中的搜索视窗构件。
getMenuInflater().inflate(R.menu.options,menu);
SearchViewsearchView=(SearchView)menu.findItem(R.id.menu_search).getActionView();
//Configurethesearchinfoandaddanyeventlisteners
returnsuper.onCreateOptionsMenu(menu);
处理可折叠的操作视窗
操作视窗让你在不改变Activity或Fragment的情况下,就可以给用户提供快捷的访问和丰富的操作。
但是,默认情况下让操作视窗可见可能不太合适。
要保证操作栏的空间(尤其是在小屏幕设备上运行时),你能够把操作视窗折叠进一个操作项按钮中。
当用户选择这个按钮时,操作视窗就在操作栏中显示。
被折叠的时候,如果你定义了android:
showAsAction=”ifRoom”属性,那么系统可能会把这个项目放到溢出菜单中,但是当用户选项了这个菜单项,它依然会显示在操作栏中。
通过给android:
showAsAction属性添加“collapseActionView”属性值,你能够让操作视窗可以折叠起来。
因为在用户选择这个项目时,系统会展开这个操作视窗,所以你不必要在onOptionsItemSelected()回调方法中响应这个菜单项。
在用户选择这个菜单项时,系统会依然调用onOptionsItemSelected()方法,但是除非你在方法中返回了true(指示你已经替代系统处理了这个事件),否则系统会始终展开这个操作视窗。
当用户选择了操作栏中的“向上”图标或按下了回退按钮时,系统也会把操作视窗折叠起来。
如果需要,你能够在代码中通过在expandActionView()和collapseActionView()方法来展开或折叠操作视窗。
尽管把操作视窗