在android3.0以后,谷歌为了统一全局UI界面,推出的新导航栏功能,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等一些通用功能。使得用户在使用任意大小的硬件以及任意软件都能自适应及方便操作。如下图所示:
其中,1为actionbar的图标,2为两个actionBar按钮,3为overflow按钮
由于Action Bar是在3.0以后的版本中加入的,如果想在2.x的版本里使用ActionBar的话则需要引入Support Library_v7,不过3.0之前版本的市场占有率已经非常小了,这里简单起见我们就不再考虑去做向下兼容,而是只考虑4.0以上版本的用法。
显示和取消ActionBar:
很简单,在只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,而使用Eclipse创建的项目自动就会将Application的theme指定成Theme.Holo,所以ActionBar默认都是显示出来的。新建一个空项目并运行,效果如下图所示:
那么问题来了,因为我的手机有物理菜单键,ActionBar最右边的overflow按钮不见了!那么此时我们如何查看隐藏在overflow中的Action按钮呢?
在不同手机上竟然显示了不同的界面,而且操作方法也完全不一样,这样会给用户一种非常不习惯的感觉。话说Google为什么要把ActionBar的overflow设计成这样我也不太理解,但是我们还是有办法改变这一默认行为的。
实际上,在ViewConfiguration这个类中有一个叫做sHasPermanentMenuKey的静态变量,系统就是根据这个变量的值来判断手机有没有物理Menu键的。当然这是一个内部变量,我们无法直接访问它,但是可以通过反射的方式修改它的值,让它永远为false就可以了,代码如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(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();
}
}
OK,问题解决
接下来,如何取消actionbar呢?
想要移除ActionBar的话通常有两种方式,一是将theme指定成Theme.Holo.NoActionBar,表示使用一个不包含ActionBar的主题,二是在Activity中调用以下方法:
ActionBar action = getActionBar();
action.hide();
修改actionBar的图标和标题
默认情况下,系统会使用
或者中icon属性指定的图片来作为ActionBar的图标,当我们要改变时,可以使用如下方法定义
android:theme="@android:style/Theme.Holo.Light"
android:logo="@drawable/android">
ActionBar action = getActionBar();
//action.hide();
action.setTitle(“示例”);
//action.setTitle(resId);
也可使用android:label=""修改
在actionBar上添加按钮
ActionBar还可以根据应用程序当前的功能来提供与其相关的Action按钮,这些按钮都会以图标或文字的形式直接显示在ActionBar上。当然,如果按钮过多,ActionBar上显示不完,多出的一些按钮可以隐藏在overflow里面(最右边的三个点就是overflow按钮),点击一下overflow按钮就可以看到全部的Action按钮了。
当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源文件里面就可以了。代码如下所示:
-
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
-
android:id="@+id/action_set"
android:icon="@drawable/set"
android:showAsAction="always"
android:title="@string/set"
/>
-
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/action_settings"/>
共三种:never,always,ifRoom
重写Activity的onCreateOptionsMenu()方法,代码如下所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
- 当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,该Action按钮就会出现在overflow当中,此时就只有title能够显示了。
- 如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内容。
点击事件:
系统会调用Activity的onOptionsItemSelected()方法,通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case R.id.action_settings:
//do something
return true;
default:
return super.onOptionsItemSelected(item);
}
}
通过Action Bar图标进行导航
A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。
我们可以通过调用setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能
ActionBar action = getActionBar();
//action.hide();
action.setTitle("示例");
action.setDisplayHomeAsUpEnabled(true);
可以看到如下:
多出了一个向左的箭头,一般使用情况是finish();
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case R.id.action_settings:
return true;
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
点击ActionBar图标的时候,系统同样会调用onOptionsItemSelected()方法,并且此时的itemId是android.R.id.home,所以finish()方法也就是加在这里。此时的
导航与Back键功能是一样的,但是并不等于Back键,这个以后再说
修改actionBar的背景色与文字颜色
这里要使用Style如下:
android:actionMenuTextColor设置文字的颜色。
看到这想必大家也已经想到了,设置背景渐变色的方法其实非常简单:
设置actionbar_gradient_bg.xml
android:shape="rectangle">
android:angle="270"
android:endColor="#ff8c00"
android:startColor="#FFFFFF"
android:type="linear" />
再在上面的style中,
OK,今天就到这吧,第一次发博客,简直要了我的老命,嘿嘿,这次只说了下actionBar的一些简单应用,别的留到下一篇吧。希望我有那个动力呀。