Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)相关的知识,希望能为你提供帮助。
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477


本篇文章主要内容来自于Android  Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。
http://developer.android.com/guide/topics/ui/actionbar.html


Action Bar是一种新増的导航栏功能,在android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且ActionBar还可以自动适应各种不同大小的屏幕。下面是一张使用ActionBar的界面截图:


Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

文章图片




其中,[1]是ActionBar的图标,[2]是两个action按钮,[3]是overflow按钮。


由于Action Bar是在3.0以后的版本中加入的,如果想在2.x的版本里使用ActionBar的话则需要引入Support Library,不过3.0之前版本的市场占有率已经非常小了,这里简单起见我们就不再考虑去做向下兼容,而是只考虑4.0以上版本的用法。


添加和移除Action Bar
ActionBar的添加非常简单,只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,而使用Eclipse创建的项目自动就会将Application的theme指定成Theme.Holo,所以ActionBar默认都是显示出来的。新建一个空项目并运行,效果如下图所示:


Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

文章图片


【Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)】

而如果想要移除ActionBar的话通常有两种方式,一是将theme指定成Theme.Holo.NoActionBar,表示使用一个不包含ActionBar的主题,二是在Activity中调用以下方法:
[java]  view plain  copy
  1. ActionBar  actionBar  =  getActionBar();    
  2. actionBar.hide();    
现在重新运行一下程序,就可以看到ActionBar不再显示了,如下图所示:


Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

文章图片




修改Action Bar的图标和标题
默认情况下,系统会使用< application> 或者< activity> 中icon属性指定的图片来作为ActionBar的图标,但是我们也可以改变这一默认行为。如果我们想要使用另外一张图片来作为ActionBar的图标,可以在< application> 或者< activity> 中通过logo属性来进行指定。比如项目的res/drawable目录下有一张weather.png图片,就可以在AndroidManifest.xml中这样指定:[html]  view plain  copy
  1. < activity   
  2.         android:name="com.example.actionbartest.MainActivity"   
  3.         android:logo="@drawable/weather"  >    
  4. < /activity>    
现在重新运行一下程序,效果如下图所示:
Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

文章图片


OK,ActionBar的图标已经修改成功了,那么标题中的内容该怎样修改呢?其实也很简单,使用label属性来指定一个字符串就可以了,如下所示:[html]  view plain  copy
  1. < activity   
  2.         android:name="com.example.actionbartest.MainActivity"   
  3.         android:label="天气"   
  4.         android:logo="@drawable/weather"  >    
  5. < /activity>    
现在重新运行一下程序,结果如下图所示:
Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

文章图片


添加Action按钮
ActionBar还可以根据应用程序当前的功能来提供与其相关的Action按钮,这些按钮都会以图标或文字的形式直接显示在ActionBar上。当然,如果按钮过多,ActionBar上显示不完,多出的一些按钮可以隐藏在overflow里面(最右边的三个点就是overflow按钮),点击一下overflow按钮就可以看到全部的Action按钮了。
当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源文件里面就可以了。
那么我们先来看下menu资源文件该如何定义,代码如下所示:[html]  view plain  copy
  1. < menu  xmlns:android="http://schemas.android.com/apk/res/android"   
  2.         xmlns:tools="http://schemas.android.com/tools"   
  3.         tools:context="com.example.actionbartest.MainActivity"  >    
  4.    
  5.         < item   
  6.                 android:id="@+id/action_compose"   
  7.                 android:icon="@drawable/ic_action_compose"   
  8.                 android:showAsAction="always"   
  9.                 android:title="@string/action_compose"/>    
  10.         < item   
  11.                 android:id="@+id/action_delete"   
  12.                 android:icon="@drawable/ic_action_delete"   
  13.                 android:showAsAction="always"   
  14.                 android:title="@string/action_delete"/>    
  15.         < item   
  16.                 android:id="@+id/action_settings"   
  17.                 android:icon="@drawable/ic_launcher"   
  18.                 android:showAsAction="never"   
  19.                 android:title="@string/action_settings"/>    
  20.    
  21. < /menu>    
可以看到,这里我们通过三个< item> 标签定义了三个Action按钮。< item> 标签中又有一些属性,其中id是该Action按钮的唯一标识符,icon用于指定该按钮的图标,title用于指定该按钮可能显示的文字(在图标能显示的情况下,通常不会显示文字),showAsAction则指定了该按钮显示的位置,主要有以下几种值可选:always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中,never则表示永远显示在overflow中。接着,重写Activity的onCreateOptionsMenu()方法,代码如下所示:[java]  view plain  copy
  1. @Override   
  2. public  boolean  onCreateOptionsMenu(Menu  menu)  {   
  3.         MenuInflater  inflater  =  getMenuInflater();    
  4.         inflater.inflate(R.menu.main,  menu);    
  5.         return  super.onCreateOptionsMenu(menu);    
  6. }   
这部分代码很简单,仅仅是调用了MenuInflater的inflate()方法来加载menu资源就可以了。现在重新运行一下程序,结果如下图所示:
Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

文章图片


可以看到,action_compose和action_delete这两个按钮已经在ActionBar中显示出来了,而action_settings这个按钮由于showAsAction属性设置成了never,所以被隐藏到了overflow当中,只要点击一下overflow按钮就可以看到它了。
这里我们注意到,显示在ActionBar上的按钮都只有一个图标而已,我们在title中指定的文字并没有显示出来。没错,title中的内容通常情况下只会在overflow中显示出来,ActionBar中由于屏幕空间有限,默认是不会显示title内容的。但是出于以下几种因素考虑,即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性:
  • 当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,该Action按钮就会出现在overflow当中,此时就只有title能够显示了。
  • 如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内容。

响应Action按钮的点击事件
当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮,比如:[java]  view plain  copy
  1. @Override   
  2. public  boolean  onOptionsItemSelected(MenuItem  item)  {   
  3.         switch  (item.getItemId())  {   
  4.         case  R.id.action_compose:   
  5.                 Toast.makeText(this,  "Compose",  Toast.LENGTH_SHORT).show();    
    • 推荐阅读