Action Bar
Posted yh_android_blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Action Bar相关的知识,希望对你有一定的参考价值。
简介
action bar 是一个功能窗口,用于标识应用程序和用户的位置,并提供给用户一些操作和导航模式。你应该在大多数需要提供用户操作或导航的activities 时使用它。因为action
bar 为用户在不同的屏幕上提供了一致的界面,并且它优雅的适应类不同的系统外观。你可以通过使用
ActionBar
类来控制action
bar 。
Action Bar 的主要目标:
- 提供一个专有的空间用于显示应用程序的标识或用户的位置
- 在不同的application上提供一致的导航和细化视图
- 突出显示一些关键的活动(例如查找、分享),并且能够实现它们的功能
从左到又依次为:logo(1)、导航选项卡(2)、任务项目(3)
添加action bar
移除action bar
如果你在一个activity中不需要 action bar 设置它的主题为.NoActionBar,或者调用action
bar的hide()方法进行隐藏,当然,show()方法可以再显示出来。
注意由于action bar的移除或隐藏而带来的布局空间的变化。如果你的activity经常性的进行action bar的隐藏/显示,你或许应该使用叠加模式(overlay mode)进行布局。
将你的action bar 放在最上层布局中,这样action bar的显隐便不会影响你的布局。
使用叠加模式,为你的activity创建一个主题且设置
android:windowActionBarOverlay=true,更多信息请查看。
添加action items(活动项)
有时候你需要在选项菜单中给用户一些直接的选项,为了实现它,必须在action bar中声明这些菜单项(menu item)并作为活动项。
一个活动项包含一个icon和text title,如果一个菜单项没有作为活动项显示,那么系统会将它放在溢出菜单(overflow menu)中。
当activitty第一次启动,系统通过调用
onCreateOptionsMenu()填充action
bar 和溢出菜单。
在这个回调方法中,你应该增加一个XML文件用以定义菜单项的菜单资源。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity, menu);
return true;
}
在这个xml文件中,你可以设置一个菜单项作为活动项通过<item>元素中的声明:android:showAsAction="ifRoom" 这样,只有当有足够空间时才会直接显示在action
bar上,否则会被收入溢出菜单。
设置显示的图标和文字:
android:title
、 android:icon
但安卓只会默认的显示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>
当用户选中了某一个活动项,activity recive便会调用onOptionsItemSelected()。
为每个菜单项定义他的title是十分有必要的,尽管他不会总是显示出来:
- 当没有足够空间显示该活动项时,它便会收入溢出菜单,而在溢出菜单中显示的是它的title
- 有时屏幕受损的用户需要阅读title而不是icon
- 如果活动项仅仅显示icon,用户可以长按按钮来显示这个item的title
icon项是可选的,但也是推荐有的。
如果你在fragement中添加菜单项,要确保onOptionsItemSelected()先于fragement内的回调函数。
你也可以声明一个项目总是(always)作为活动项显示,而不是收入溢出菜单。当空间受限时,就不该使用always这个值。最好使用ifRoom。
选则活动项
你应该谨慎的选择那些直接显示出来的菜单项作为活动项,一般,每一个活动项至少遵循一种如下情况:
- 频繁使用:十次有七次都会使用的操作
- 重要:它提供的功能能够简便用户的操作。
- 典型的:在类似的app中都会提供的操作,例如刷新,新建等。
如果你有超过4个菜单项需要作为活动项,那么你必须谨慎的考虑他们的相对等级,并且努力不要超过4个活动项(使用ifRoom是个好办法),即使有足够的空间也不应该显示太多的活动项。
另外,如下的操作都不应该作为活动项显示:设置、帮助、反馈或者类似的。
如果有需要,查找操作应该是你显示的第一个活动项
使用分离操作栏(split action bar)
这是一个专门为狭窄屏幕手机设计的action bar,它的导航部分(2)和app声明部分(1)是分离的。
使用它必须在manifest文件中的<application>或<activity>中加上uiOptions="splitActionBarWhenNarrow"。
尽管在4.0才出现的,但在之前的版本也能工作
使用app 图标进行导航
默认情况下,你的app图标会显示在action bar的左边,如果需要,可以将它作为一个活动项。一般会做如下两件事情:
- 回到应用的主activity
-
Navigating up
当用户触摸icon 系统便会调用activity里的
onOptionsItemSelected()
方法,并且传递android.R.id.home
ID。作为响应,应该启动主actiivty或者返回上一个activity。如果是返回主activity,应该在intent中设置flag=
FLAG_ACTIVITY_CLEAR_TOP有了这个flag,它会销毁在主activity之前的所有activity,以确保主activity在第一个(栈顶)。
下面是一个点击icon返回主activity的片段
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
为确保用户能够通过其它app进入当前的activity,也可能需要加上
FLAG_ACTIVITY_NEW_TASK
flag。事实上,当你的app需要接受来自其他app的intent,都需要加入该flag。Navigating up
up 不同于back ,有时候会另启一个新的任务栈,从而不能使用返回键返回上一屏幕状态。
使用该功能,必须调用action bar的
setDisplayHomeAsUpEnabled(true)
函数,其它设置同上。使用action view
action view 是作为action item按钮的替代项而显示在action bar上的小部件。
在你的菜单资源文件中声明一个action view 需含有
android:actionLayout
或者android:actionViewClass
属性<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_search"
android:title="@string/menu_search"
android:icon="@drawable/ic_menu_search"
android:showAsAction="ifRoom|collapseActionView"//表明需要嵌入一个button中,当用户点击该按钮,view展开。
android:actionViewClass="android.widget.SearchView" />
</menu>
如果需要添加一些事件钩子,可以在onCreateOptionsMenu()中通过如下示例获得实例对象:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
// Configure the search info and add any event listeners
...
return super.onCreateOptionsMenu(menu);
}
action view 的折叠处理
一般系统会自动处理扩展和折叠,你不必做任何操作,只需要像上面item这样配置即可。
一般对查找功能的action view的操作,建议使用
SearchView
.
这个类。当然,一些设备也会提供专有的查找按钮,使用时只需在onKeyUp()
监听 KEYCODE_SEARCH
事件,然后调用expandActionView()
.你可以在展开或折叠后做一些事情,通过设置监听器:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
MenuItem menuItem = menu.findItem(R.id.actionItem);
...
menuItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
以上是关于Action Bar的主要内容,如果未能解决你的问题,请参考以下文章
此活动已经有一个由窗口装饰提供的操作栏(FEATURE_ACTION_BAR)