1. 程式人生 > >Android活動條(actionbar)使用詳解(一)

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.   <item  
  30.       android:id="@+id/plain_item"  
  31.       android:title="@string/palin_item"  
  32.       android:showAsAction="always|withText">  
  33.   </item>  
  34.  <!-- 第三個選單項:字型顏色-->  
  35.  <item  
  36.      android:title="@string/font_color"  
  37.      android:icon="@drawable/color"  
  38.      android:showAsAction="always|withText">  
  39.        <!-- 定義一組單選選單項 ,然後定義一組選單選項-->  
  40.        <menu>  
  41.   <group>  
  42.       <item  
  43.           android:id="@+id/red_font"  
  44.           android:title="@string/red_title"/>  
  45.       <item  
  46.           android:id="@+id/blue_font"  
  47.           android:title="@string/blue_title"/>  
  48.       <item  
  49.           android:id="@+id/green_font"  
  50.           android:title="@string/blue_title"/>  
  51.   </group>  
  52.    </menu>  
  53.  </item>  
  54. </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.  ActionBar actionbar;  
  14.  private TextView txt;  
  15.  @Override  
  16.  protected void onCreate(Bundle savedInstanceState) {  
  17.   super.onCreate(savedInstanceState);  
  18.   setContentView(R.layout.main);  
  19. /1./獲取當前Activity的actionBar
  20.   actionbar=getActionBar();    
  21.  }  
  22.  //2.將Xml資源新增到menu選單中  
  23.  public boolean onCreateOptionsMenu(Menu menu)  
  24.  {  
  25.   MenuInflater inflator=new MenuInflater(this);  
  26.   inflator.inflate(R.menu.menu, menu);  
  27.   return super.onCreateOptionsMenu(menu);  
  28.  }  
  29.  //3.響應並實現選單項功能  
  30.  public boolean onOptionsItemSelected(MenuItem mi)  
  31.  {  
  32.   if(mi.isCheckable())  
  33.   {  
  34.    mi.setChecked(true);  
  35.   }  
  36.   switch(mi.getItemId())  
  37.   {  
  38.    //設定字型大小  
  39.    case R.id.font_10:  
  40.     txt.setTextSize(10*2);  
  41.     break;  
  42.    case R.id.font_12:  
  43.     txt.setTextSize(12*2);  
  44.     break;  
  45.    case R.id.font_14:  
  46.     txt.setTextSize(14*2);  
  47.     break;  
  48.    //設定字型顏色  
  49.    case R.id.blue_font:  
  50.     txt.setTextColor(Color.BLUE);  
  51.     mi.setChecked(true);  
  52.     break;  
  53.    case R.id.green_font:  
  54.     txt.setTextColor(Color.GREEN);  
  55.     mi.setChecked(true);  
  56.     break;  
  57.    //設定普通選單響應  
  58.    case R.id.plain_item:  
  59.     Toast toast=Toast.makeText(MainActivity.this, "您單擊了普通選單", Toast.LENGTH_SHORT);  
  60.     toast.show();  
  61.     break;  
  62.   }  
  63.   return true;      
  64.  }  
(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. <?xmlversion="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. <!-- Action Item為檢視資源-->  
  11. <item  
  12. android:id="@+id/clock"  
  13. android:title="模擬時鐘"  
  14. android:orderInCategory="100"  
  15. android:showAsAction="ifRoom|collapseActionView"  
  16. android:actionLayout="@layout/clock"/>  
  17. </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按鈕。