time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android ActionBar完全解析之使用官方推荐的最佳导航栏(上)

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

时间:2014-06-20 15:24 点击:4501次 字体:[ ]




本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。

http://developer.android.com/guide/topics/ui/actionbar.html

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

Android ActionBar完全解析之使用官方推荐的最佳导航栏(上)_www.fengfly.com
 

其中,[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完全解析之使用官方推荐的最佳导航栏(上)_www.fengfly.com
 

而如果想要移除ActionBar的话通常有两种方式,一是将theme指定成Theme.Holo.NoActionBar,表示使用一个不包含ActionBar的主题,二是在Activity中调用以下方法:

ActionBar actionBar = getActionBar();
actionBar.hide();

现在重新运行一下程序,就可以看到ActionBar不再显示了,如下图所示:

 

Android ActionBar完全解析之使用官方推荐的最佳导航栏(上)_www.fengfly.com
 


 

修改Action Bar的图标和标题

默认情况下,系统会使用<application>或者<activity>中icon属性指定的图片来作为ActionBar的图标,但是我们也可以改变这一默认行为。如果我们想要使用另外一张图片来作为ActionBar的图标,可以在<application>或者<activity>中通过logo属性来进行指定。比如项目的res/drawable目录下有一张weather.png图片,就可以在AndroidManifest.xml中这样指定:
  1. <activity 
  2.     android:name="com.example.actionbartest.MainActivity" 
  3.     android:logo="@drawable/weather" > 
  4. </activity> 
现在重新运行一下程序,效果如下图所示:
Android ActionBar完全解析之使用官方推荐的最佳导航栏(上)_www.fengfly.com
 
OK,ActionBar的图标已经修改成功了,那么标题中的内容该怎样修改呢?其实也很简单,使用label属性来指定一个字符串就可以了,如下所示:
  1. <activity 
  2.     android:name="com.example.actionbartest.MainActivity" 
  3.     android:label="天气" 
  4.     android:logo="@drawable/weather" > 
  5. </activity> 
现在重新运行一下程序,结果如下图所示:
Android ActionBar完全解析之使用官方推荐的最佳导航栏(上)_www.fengfly.com
 

 

添加Action按钮

ActionBar还可以根据应用程序当前的功能来提供与其相关的Action按钮,这些按钮都会以图标或文字的形式直接显示在ActionBar上。当然,如果按钮过多,ActionBar上显示不完,多出的一些按钮可以隐藏在overflow里面(最右边的三个点就是overflow按钮),点击一下overflow按钮就可以看到全部的Action按钮了。
当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源文件里面就可以了。
那么我们先来看下menu资源文件该如何定义,代码如下所示:
  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()方法,代码如下所示:
  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完全解析之使用官方推荐的最佳导航栏(上)_www.fengfly.com
 
可以看到,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按钮,比如:
  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();  
  6.         return true;  
  7.     case R.id.action_delete:  
  8.         Toast.makeText(this"Delete", Toast.LENGTH_SHORT).show();  
  9.         return true;  
  10.     case R.id.action_settings:  
  11.         Toast.makeText(this"Settings", Toast.LENGTH_SHORT).show();  
  12.         return true;  
  13.     default:  
  14.         return super.onOptionsItemSelected(item);  
  15.     }  
  16. }  
可以看到,我们让每个Action按钮被点击的时候都弹出一个Toast,现在重新运行一下代码,结果如下图所示:
Android ActionBar完全解析之使用官方推荐的最佳导航栏(上)_www.fengfly.com
 

 

 



本文地址 : http://www.fengfly.com/plus/view-215121-1.html
标签: Android 导航栏 ActionBar
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: