活动条(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还能够依据应用程序当前的功能来提供与其相关的Actionbutton,这些button都会以图标或文字的形式直接显示在ActionBar上。

当然。假设button过多,ActionBar上显示不完。多出的一些button能够隐藏在overflow里面(最右边的三个点就是overflowbutton),点击一下overflowbutton就能够看到全部的Actionbutton了。 当Activity启动的时候。系统会调用Activity的onCreateOptionsMenu()方法来取出全部的Actionbutton,我们仅仅须要在这种方法中去载入一个menu资源(menu/*.xml)。并把全部的Actionbutton都定义在资源文件中面就能够了

    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):设置是否将应用程序图标转换变成可点击的button;
源代码实战
功能:将该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.设置是否将应用程序图标转换变成可点击的button
  actionBar.setHomeButtonEnabled(true);
  //d.将应用程序图标设置为可点击的button并在图标上加入向左箭头
 }
 @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)作为一个功能button的替代。操作视图提供了高速訪问行为而不改变活动或片段,且没有替换动作栏。比如,假设你想实现搜索动作,能够在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"  属性值表示该空间能够被合并成一个Actionbutton。

posted on 2017-07-19 09:29  lxjshuju  阅读(484)  评论(0编辑  收藏  举报