Android导航栏ActionBar的详细分析

尊重原创:

关于ActionBar,相信大家并不陌生,但是真正能够熟练使用的也不是很多,这篇文章主要为大家详细介绍ActionBar的相关知识,ActionBar是在Android3.0中引入的概念,所以在2.x系统中使用ActionBar我们需要依赖ActionBarSherklock或者androi-support-v7库,ActionBarSherklock是anroid中非常有名的一个开源项目,android-support-v7是Google后来推出的一个库,有了v7库后AndroidBarSherklock这个开源项目基本可以退出历史舞台了,在使用android-support-v7的过程中,一定不能仅仅使用它的jar包,因为它的jar包不包含一些重要的资源文件,我们必须导入android-support-v7工程,然后让我们的工程依赖它。

ActionBar的作用1、帮助用户知道你现在处于哪个页面2、为用户提供统一的导航界面关于更多的ActionBar导航功能请参见 我的这篇文章基本也是参考这里的ActionBar在界面中的展现形式 如下图:

从图中可以看到一个ActionBar包括 APP icon,ActionItems,Action Overflow,其实ActionBar基本就代替了以前版本中的菜单的概念,在不支持ActionBar的App中,如果你创建了菜单,当你点击菜单键时,下方会出来菜单,而在支持Actionbar的菜单中这些菜单向就出现在了ActionItem和Action Overflow里面了(详细请见后面),有些细心同学在平时可能会发现同一款App,在有些手机上出现了Overflow,而有些手机却没有,其实这个是有规律的,在有菜单物理键的手机上是没有Overflow的,在没有物理菜单的手机上才有,其实Google一直主张Android设备去掉物理菜单键,所以相信以后大部分手机都没有菜单物理键的,所以菜单的概念也会慢慢的淡化。

下面我们开始学习ActionBar吧 ,由于3.0之后的系统和2.x系统还是有稍微的区别,所以我今天打算先讲讲2.x系统中ActionBar的使用,然后讲解3.0之后系统ActionBar的使用。这里我们就使用android-support-v7吧,毕竟它是Google推出来的。

在2.x上使用ActionBar的步骤

1、导入android-support-v7库,这个库其实在你的sdk里面就有(前提是你已经下载下来了),如我的路径:D:\android-sdk-windows\extras\android\support\v7\appcompat2、创建项目,让我们的库依赖andorid-support-v7,并让需要使用ActionBar的Activity依赖ActionBarActivity,并进行如下配置:

<activity android:theme="@style/Theme.AppCompat.Light" … >就这么简单,你的项目就已经引入了ActionBar了,如果你想隐藏ActionBar,如下操作即可ActionBar actionBar = getSupportActionBar();actionBar.hide();这里要提醒一下:由于ActionBar在隐藏的时候会重现绘制Activity的界面,从而填充ActionBar的空白,所以当你频繁的隐藏和显示ActionBar时,会导致Activity的界面频繁重绘,为了避免这种情况发生,你可以再actionBarStyle中将 windowActionBarOverlay这个属性设置为true,也就是说ActionBar会在Activity的上面,隐藏和显示不会影响Activity我上面引入的ActionBar没有引入任何内容,默认里面就是一个设置项,现在我们就像里面加入自己的item吧创建res/menu/main_activity_actions.xml文件并加入如下内容,<menu xmlns:android="" > <itemandroid:id="@+id/action_copy"android:icon="@drawable/copy"android:title="复制"/><itemandroid:id="@+id/action_cut"android:icon="@drawable/cut"android:title="剪切"/><itemandroid:id="@+id/action_discard"android:icon="@drawable/discard"android:title="删除"/><itemandroid:id="@+id/action_edit"android:icon="@drawable/edit"android:title="编辑"/><itemandroid:id="@+id/action_email"android:icon="@drawable/email"android:title="邮箱"/></menu>然后重写下面的方法:@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);//返回true才会显示overflow按钮return true; }通过以上步骤,我们就已经向ActionBar中加入了5个Item,运行一下看看效果吧,如下图

ActionBar是出来了,但是和我们上面说的ActionBar貌似有些区别,这些item都进入了overflow了,另外就是我明明设置了icon属性,,却没有看见icon对于这两个问题,我们一一解决吧item默认都是进入Overflow的,如果想有些重要的Item 进入ActionItem 里面,那么需要配置一个属性showAsAction<menu xmlns:android=""xmlns:yourapp="" ><itemandroid:id="@+id/action_copy"android:icon="@drawable/copy"android:title="复制"yourapp:showAsAction="always" />…</menu>注意这里的showAsActoin命名空间是自定义的,不是"android",因为这个属性在2.x系统中没有,是andorid-support-v7定义的,你运行一下,会发现复制已经到了ActionItem的位置了

第二个问题就是设置了icon为什么没有显示?其实在Actionbar中,处于ActionItem位置的item默认是显示icon而不显示title的,我们可以通过在showAsActoin中配置"always|withText",让Tiele显示出来(但是也不一定会显示,只是尽量显示),而处于Overflow的item 默认是显示title而不显示icon的,这个可以通过反射机制来改变,方案如下:

public void setOverflowIconVisiable(Menu menu) {try{Class clazz=Class.forName("com.android.internal.view.menu.MenuBuilder");Field field=clazz.getDeclaredField("mOptionalIconsVisible");if(field!=null){field.setAccessible(true);field.set(menu , true);}} catch (ClassNotFoundException e){e.printStackTrace();} catch (NoSuchFieldException e){e.printStackTrace();} catch (IllegalArgumentException e){e.printStackTrace();} catch (IllegalAccessException e){e.printStackTrace();}}然后再onMenuOpened方法中调用 @Override public boolean onMenuOpened(int featureId, Menu menu) {if(featureId == Window.FEATURE_ACTION_BAR && menu != null){setOverflowIconVisiable(menu);}return super.onMenuOpened(featureId, menu); }运行效果如下图,可以看到icon已经显示了有的旅行是为了体验生活,感悟人生。

Android导航栏ActionBar的详细分析

相关文章:

你感兴趣的文章:

标签云: