Android活动条(actionbar)使用详解(一)

    活动条(ActionBar)是Android3.0的重要更新之一,ActionBar位于传统标题的位置,其主要提供了如下功能:
    >显示选项菜单的菜单项,即激昂菜单项显示在Action Item;
    >使用程序图标作为返回Home主屏或向上的导航操作;
    >提供交互式View作为Action View;
    >提供基于Tab的导航方式,可用于切换多个Fragment
    >提供基于下拉的导航方式
1.启用/关闭ActionBar
    Android3.0及以上版本已经默认启用了ActionBar,只需要在AndroidManifest.xml文件的SDK配置指定Android版本高于11就会默认启用ActionBar,代码如下:
    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="17" />
在实际项目中,通常推荐使用代码来控制ActionBar的显示、隐藏,代码实现如下:
    ActionBar actionBar = getActionBar();        //返回ActionBar实例
     actionBar.show();                                        //显示
    actionBar.hide();                                            //隐藏
当然,只有当应用主题没有关闭ActionBar时才能返回ActionBar实例。如果设置应用主题或Activity的主题属性 Android:name="@android:style/Theme.Holo.NoActionBar",则关闭ActionBar活动条功能。
注意:在使用ActionBar过程中,明明我们将Android的SDK版本设置大于3.0,但是仍不能实现在标题栏显示ActionBar或者getActionBar()返回的null。这是由于Android应用的主题的错误,有两种方法:
(1)在新建项目时,设置Android版本高于3.0


(2)删除AndroidManifest.xml清单文件<Application.../>元素中的Android:theme属性,然后在Activity代码中添加getWindow().requestFeature(Window.FEATURE_ACTION_BAR);即可
2.使用ActionBar显示选项菜单
    由于有些手机不存在MENU按键,Android提供了ActionBar将选项菜单显示成Action Item。从Android 3.0开始,MenuItem新增如下方法用于将菜单选项显示在ActionBar上作为ActionItem。ActionBar还可以根据应用程序当前的功能来提供与其相关的Action按钮,这些按钮都会以图标或文字的形式直接显示在ActionBar上。当然,如果按钮过多,ActionBar上显示不完,多出的一些按钮可以隐藏在overflow里面(最右边的三个点就是overflow按钮),点击一下overflow按钮就可以看到全部的Action按钮了。  当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的Action按钮,我们只需要在这个方法中去加载一个menu资源(menu/*.xml),并把所有的Action按钮都定义在资源文件里面就可以了
     setShowAsAction(int actionEnum)
    该方法设置是否将该菜单显示在ActionBar上,作为ActionItem。其中,actionEnum方法支持如下参数值:
    >SHOW_AS_ACTION_ALWAYS:总是将该MenuItem显示在ActionBar上;
    >SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW:将该Action View折叠成普通菜单项
    >SHOW_AS_ACTION_IF_ROOM:当ActionBar位置足够时才显示MenuItem
    >SHOW_AS_ACTION_NEVER:不将该MenuItem显示在ActionBar上
    >SHOW_AS_ACTION_WITH_TEXT:将该MenuItem显示在ActionBar上,并显示菜单项的文本
然后,在实际项目中我们推荐使用XML资源文件来定义菜单,因为,我们可以直接在菜单资源文件中的<item.../>元素指定如下属性即可:
    <item android:title="菜单项名称"
              android:icon="菜单项标题"
              android:showAsAction="always|withText"    
             //总是将菜单项显示在ActionBar上并显示菜单项的文本
              ......./>
源码举例
(1)菜单资源文件/res/menu/menu.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.  <!-- 第一个菜单项:字体大小菜单,并设置为ActionBar(假如手机无Menu键)-->  
  4.     <item android:title="@string/font_size"  
  5.           android:icon="@drawable/font"  
  6.           android:showAsAction="always|withText">  
  7.           <menu>  
  8.               <!-- 定义一组单选菜单项 ,然后定义一组菜单选项-->  
  9.               <group android:checkableBehavior="single">  
  10.                   <item  
  11.                       android:id="@+id/font_10"  
  12.                       android:title="@string/font_10"/>  
  13.                   <item  
  14.                       android:id="@+id/font_12"  
  15.                       android:title="@string/font_12"/>  
  16.                   <item  
  17.                       android:id="@+id/font_14"  
  18.                       android:title="@string/font_14"/>  
  19.                   <item  
  20.                       android:id="@+id/font_16"  
  21.                       android:title="@string/font_16"/>  
  22.                   <item  
  23.                       android:id="@+id/font_18"  
  24.                       android:title="@string/font_18"/>  
  25.               </group>  
  26.           </menu>  
  27.      </item>  
  28.            
  29.  <!-- 第二个菜单项:普通菜单-->  
  30.   <item  
  31.       android:id="@+id/plain_item"  
  32.       android:title="@string/palin_item"  
  33.       android:showAsAction="always|withText">  
  34.   </item>  
  35.    
  36.  <!-- 第三个菜单项:字体颜色-->  
  37.  <item  
  38.      android:title="@string/font_color"  
  39.      android:icon="@drawable/color"  
  40.      android:showAsAction="always|withText">  
  41.        <!-- 定义一组单选菜单项 ,然后定义一组菜单选项-->  
  42.        <menu>  
  43.   <group>  
  44.       <item  
  45.           android:id="@+id/red_font"  
  46.           android:title="@string/red_title"/>  
  47.       <item  
  48.           android:id="@+id/blue_font"  
  49.           android:title="@string/blue_title"/>  
  50.       <item  
  51.           android:id="@+id/green_font"  
  52.           android:title="@string/blue_title"/>  
  53.   </group>  
  54.    </menu>  
  55.  </item>  
  56. </menu>   
注释:android:showAsAction属性,用于指定了菜单项在ActionBar上显示的形式或位置,主要有以下几种值可选:
    >always:表示永远显示在ActionBar中,如果屏幕空间不够则无法显示;
    >ifRoom:表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在折叠图标中
    >never:表示永远显示在折叠图标中,用户单击该折叠图标将显示所有选项菜单项
    >withText:表示显示菜单项的名称
(2)src/MainActivity.java
  1. package com.android.android_actionbar_2;  
  2. import android.app.ActionBar;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.Color;  
  6. import android.os.Bundle;  
  7. import android.view.Menu;  
  8. import android.view.MenuInflater;  
  9. import android.view.MenuItem;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12. public class MainActivity extends Activity {  
  13.   
  14.  ActionBar actionbar;  
  15.  private TextView txt;  
  16.  @Override  
  17.  protected void onCreate(Bundle savedInstanceState) {  
  18.   super.onCreate(savedInstanceState);  
  19.   setContentView(R.layout.main);     
  20. /1./获取当前Activity的actionBar
  21.   actionbar=getActionBar();    
  22.  }  
  23.    
  24.  //2.将Xml资源添加到menu菜单中  
  25.  public boolean onCreateOptionsMenu(Menu menu)  
  26.  {  
  27.   MenuInflater inflator=new MenuInflater(this);  
  28.   inflator.inflate(R.menu.menu, menu);  
  29.   return super.onCreateOptionsMenu(menu);  
  30.  }  
  31.    
  32.  //3.响应并实现菜单项功能  
  33.  public boolean onOptionsItemSelected(MenuItem mi)  
  34.  {  
  35.   if(mi.isCheckable())  
  36.   {  
  37.    mi.setChecked(true);  
  38.   }  
  39.   switch(mi.getItemId())  
  40.   {  
  41.    //设置字体大小  
  42.    case R.id.font_10:  
  43.     txt.setTextSize(10*2);  
  44.     break;  
  45.    case R.id.font_12:  
  46.     txt.setTextSize(12*2);  
  47.     break;  
  48.    case R.id.font_14:  
  49.     txt.setTextSize(14*2);  
  50.     break;  
  51.    //设置字体颜色  
  52.    case R.id.blue_font:  
  53.     txt.setTextColor(Color.BLUE);  
  54.     mi.setChecked(true);  
  55.     break;  
  56.    case R.id.green_font:  
  57.     txt.setTextColor(Color.GREEN);  
  58.     mi.setChecked(true);  
  59.     break;  
  60.    //设置普通菜单响应  
  61.    case R.id.plain_item:  
  62.     Toast toast=Toast.makeText(MainActivity.this, "您单击了普通菜单", Toast.LENGTH_SHORT);  
  63.     toast.show();  
  64.     break;  
  65.   }  
  66.   return true;      
  67.  }  
  68.  
(3)效果演示

3.启用程序图标导航
    为了实现将应用程序图标转变成可以点击的图标,可以调用ActionBar的以下方法:
    >setDisplayHomeAsUpEnabled(boolean showHomeAsUp):设置是否将应用程序图标转变成可点击的图标,并在图标上添加一个向左的箭头;
    >setDisplayOptions(int options):通过传入int类型变量来控制该ActionBar的显示选项;
    >setDisplayShowHomeEnabled(boolean showHome):设置是否显示应用程序的图标;
    >setHomeButtonEnabled(boolean enabled):设置是否将应用程序图标转换变成可点击的按钮;
源码实战
功能:将该Activity的程序图标转变成可点击的图标,并控制用于单击该图标时返回程序的主Activity.
package com.example.actionbar;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
/**
 *	项目名称/版本号:Actionbar/v1.0
 *	包   名:com.example.actionbar
 *	类描述:启用程序图标导航.点击应用程序图标,返回主界面
 *	创建人:jiangdongguo
 *	创建时间:2015-6-12 下午8:20:14
 * 博客地址:http://blog.csdn.net/u012637501
 */
public class ActionHome extends Activity {
 private ActionBar actionBar;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //a.获得ActionBar实例
  actionBar = getActionBar();
  //b.设置是否显示应用程序图标
  actionBar.setDisplayShowHomeEnabled(true);
  //c.设置是否将应用程序图标转换变成可点击的按钮
  actionBar.setHomeButtonEnabled(true);
  //d.将应用程序图标设置为可点击的按钮并在图标上添加向左箭头
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method stub
  return super.onCreateOptionsMenu(menu);
 }
 /**
  *选项菜单的菜单项被单击后的回调方法
  * */
 public boolean onOptionsItemSelected(MenuItem item) {
  //判断菜单项是否能被点击,是则使能菜单项
  if(item.isChecked()){
   item.setChecked(true);
  }
  //判断单击的是哪个菜单项,并作出相应的响应
  switch (item.getItemId()) {
  case android.R.id.home:
   Intent intent = new Intent(ActionHome.this,MainActivity.class);
   startActivity(intent);
   this.finish();
   break;
  default:
   break;
  }
  return true;
 }
}
效果演示:

4.使用View作为Action View
   ActionBar上除了可以显示普通的Action Item之外,还可以显示普通的UI组件(widget)作为一个功能按钮的替代。操作视 图提供了快速访问行为而不改变活动或片段,且没有替换动作栏。例如,如果你想实现搜索动作,可以在action bar中嵌入一个SearchView窗口部件。 为了实现一个action view到动作栏中,我们可以使用 actionLayout  or  actionViewClass 属性来指定一个布局(xml)资源或者窗口部件widget到Action Bar.具体操作:
>定义Action Item时,使用android:actionViewClass属性指定Action View的实现类(widget);
>定义Action Item时,使用android:actionLayout属性指定Action View对应的视图(layout);
(1)菜单资源res/menu/menu.xml
    在菜单资源中定义Action Item,但这Action Item使用的是Action View而不是不同的Action Item。
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">   
  3. <!-- Action Item为widget-->   
  4. <item  
  5. android:id="@+id/search"  
  6. android:title="搜索"  
  7. android:orderInCategory="100"  
  8. android:showAsAction="ifRoom|collapseActionView"  
  9. android:actionViewClass="android.widget.SearchView"/>  
  10.   
  11. <!-- Action Item为视图资源-->  
  12. <item  
  13. android:id="@+id/clock"  
  14. android:title="模拟时钟"  
  15. android:orderInCategory="100"  
  16. android:showAsAction="ifRoom|collapseActionView"  
  17. android:actionLayout="@layout/clock"/>  
  18. </menu> 
其中,clock视图实现代码如下/res/layout/clock.xml:
<?xml version="1.0" encoding="utf-8"?>  
<AnalogClock  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"    />
(2)为Action View添加事件监听器
    Action视图的事件监听主要在onCreateOptionsMenu()方法中实现,通过调用MenuItemCompat.getActionView并传递相应的菜单项(MenuItem)来获取Action视图对象。
  1. public boolean onCreateOptionsMenu(Menu menu) {  
  2.     getMenuInflater().inflate(R.menu.menu, menu);          //加载菜单资源
  3.     MenuItem searchItem = menu.findItem(R.id.search);  //获得MenuItem对象
  4.     SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);  //获得Action视图对象
  5.     // Configure the search info and add any event listeners  //为Action视图对象注册事件监听器
  6.     ...  
  7.     return super.onCreateOptionsMenu(menu);  
  8. }  
(3)效果如下
  
注: android:showAsAction = "collapseActionView"   属性值表示该空间可以被合并成一个Action按钮。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值