转自郭大神,稍加更改:http://blog.csdn.net/guolin_blog/article/details/18234477
一、ActionBar是什么
是一种新增的导航栏按钮,在Android3.0之后加入,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等操作。
[1]是ActionBar,[2]是两个action按钮,[3]是overflow按钮
二、用在哪
先说说优点:UI布局统一,使用起来无代沟,并且ActionBar还可以自动适配不同屏幕。所以,想实现这个特点就用ActionBar。
三、怎么用
在2.x版本中用需导包:Support Library。
1、添加和删除ActionBar
添加:只需在AndroidMainfest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可。创建新项目时默认已设置。
删除:三种方式:1)将theme指定为Theme.Holo.NoActionBar。2)ActionBar actionBar=getActionBar(); actionBar.hide();3)删除java文件中的onCreateOptionsMenu()。
2、修改ActionBar的图标和标题
修改图标:默认,系统使用<application>或<activity>中icon或logo属性指定的图片来作为ActionBar的图标,更改即可。
修改标题:修改同上位置的label属性。
3、添加action按钮
当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法加载布局文件中定义的按钮。所以,只需在布局文件中添加Action定义即可增加Action按钮。
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:icon="@drawable/aaa"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
<item
android:id="@+id/action_delete"
android:icon="@drawable/aaa"<span style="white-space:pre">
android:orderInCategory="100"<span style="white-space:pre">
android:showAsAction="always"<span style="white-space:pre">
android:title="@string/action_delete"/><span style="white-space:pre">
<item
android:id="@+id/action_add"
android:orderInCategory="100"
android:showAsAction="never"
android:icon="@drawable/aaa"
android:title="@string/action_delete"/>
</menu>
title:指定该按钮显示的文字。(有图标时,通常不会显示文字;长按时会以toast方式显示文字)
orderIncategory:每个action按钮的优先级。值越大优先级越低,地方不够就会被放到overflow中。
showAsAction:三个值。never:永远显示在overflow中;ifRoom:屏幕空间足够时显示在ActionBar中,不够时显示在overflow中;always:永远显示在ActionBar中。
4、响应Action按钮的点击事件
点击事件的响应方法:onOptionsItemSelected()。通过传入的参数MenuItem.getItemId()来区分action按钮。
5、通过ActionBar图标进行导航
比如A界面跳到B界面,B界面又跳到C界面,此时想直接返回A界面,即可通过ActionBar来实现。三步实现:
1)给当前页面加入A界面的ActionBar。在onCreate函数中加入代码:
setTitle("天气");
setContentView(R.layout.enter);
ActionBar ab=getActionBar();
ab.setDisplayHomeAsUpEnabled(true);
2)在AndroidMainfest.xml中配置父activity。
6、添加Action View
ActionView是一种可以在ActionBar中替换Action按钮的控件。它可以允许用户在不切换界面的情况下通过ActionBar完成一些较为丰富的操作。比如,你需要完成一个搜索功能,就可以将SearchView这个控件添加到ActionBar中。为了声明一个ActionView,可在menu资源中通过actionViewClass属性指定一个控件。例如:
注意在showAsAction属性中我们还声明了一个collapseActionView,这个值表示该控件可以被合并成一个Action按钮。点击搜索前和后的效果图:
如果还希望在代码中对SearchView的属性进行配置(比如监听事件),只需在onCreateOptionsMenu()方法中获取该ActionView的实例即可。
SearchView searchView = (SearchView) searchItem.getActionView();
// 配置SearchView的属性
SearchView更多用法,参考:
http://developer.android.com/guide/topics/search/search-dialog.html
除此之外,有些程序还希望能在ActionView展开和合并的时候显示不同的界面。只需注册一个ActionView的监听器即可。MenuItem.setOnActionExpandListener()和MenuItem.setOnActionCollapseListener().
7、Overflow不显示的情况
如果手机没有物理menu键,overflow就显示;否则就不显示。不显示时,按下menu键,隐藏的内容就会从底部显示出来。
解决办法:在ViewConfiguration这个类中有一个叫做sHasPermanentKey的静态变量,系统就是根据这个变量的值来判断手机有没有物理Menu键的。这是一个内部变量,无法直接访问,可通过反射的方式修改它的值,让它永远为false就行了。
protected void onCreate(Bundle savedInstanceState) {
......
setOverflowShowingAlways();
}
private void setOverflowShowingAlways() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
} catch (Exception e) {
e.printStackTrace();
}
}
setOverflowShowingAlways()内部使用反射方式将sHasPermanentMenuKey的值设为false。
8、让Overflow中的选项显示图标
Overflow中的Action按钮显示不显示图标,是由MenuBuilder这个类的setOptionallconsVisible()来决定的,如果我们再Overflow被展开的时候给这个方法传入true,那么里面的每个Action按钮对应的图标就都会显示出来了。调用的方法仍然是反射了。
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
try {
Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
}
}
}
return super.onMenuOpened(featureId, menu);
}