【Android】ActionBar的使用(1)

來源:互聯網
上載者:User

標籤:android   actionbar   導覽列   

前(fei)言(hua):轉行iOS開發半年,很久沒接觸Android了,前幾天去上課,聽著實在無聊,隨手拿了同學的一本《Android UI設計》,發現有好多基礎知識自己雖然用過,但是都是當初做Android開發時,當項目需要的用到的時候才去百度,control+c和control+v後,便草草完事,以至於有時再需要使用某個控制項或者功能時,再去百度或者翻查以前的代碼。雖然曾經做了2年Android開發,但只是做了幾個很水的app,為了不虧欠那兩年奮鬥的青春,現在開始,我將寫一些關於Android基礎的blog,祭奠下學Android的兩年青春。廢話不多說,這是這個系列第一篇《ActionBar的使用(1)》


1.什麼是ActionBar?

Android的action bar是一個window 特性,能顯示使用者現在所處app的哪個頁面(顯示頁面標題)、提供動作按鈕(搜尋、新增等)和導航(返回),和iOS的UINavigationBar作用一樣。直接上官方圖:


這是一個ActionBar例子,包含 [1] app icon, [2] 兩個action items, 和 [3] action overflow.


ActionBar從 Android 3.0 (API level 11) 開始提供,如果我們建立的項目僅支援Android 3.0及以上,我們可以直接使用架構中的ActionBar API。如果要在 Android 2.1 (API level 7)及以上版本中使用,可以通過添加android-support-v4.jar後使用。上面提到的兩種情況下,大多數API是一樣的,只是包名不同:

API11以上

import android.app.ActionBar

API11以下

import android.support.v7.app.ActionBar

考慮到現在的Android手機版本都在4.0以及上,本文主要使用android.app.ActionBar。


建立項目時,只要 targetSdkVersion 或者 minSdkVersion設定為“11”或以上 ,Activity預設使用主題為 Theme.Holo,都帶有ActionBar了,如果不需要使用ActionBar,可以將主題設為Theme.Holo.NoActionBar。



1.擷取、隱藏和顯示ActionBar

ActionBar actionBar = getActionBar();//擷取ActionBar

actionBar.hide();//隱藏ActionBar

當actionBar被隱藏後,系統會自動調節布局來適配螢幕空間,可以調用show()來讓actionBar重新顯示。

*使用android-support-v4時,將getActionBar()改為getSupportActionBar()


2.添加Action Items

當我們的activity start,系統會調用activity的onCreateOptionsMenu()方法來建立action items,使用這個方法來載入定義了action items的菜單資源,例如,要添加兩個action items,在res目錄下建立一個檔案夾,命名為menu,並建立一個xml檔案,命名為main_activity_actions.xml, 添加以下代碼,這段代碼定義了兩個action items:

res/menu/main_activity_actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:id="@+id/action_search"          android:icon="@drawable/ic_action_search"          android:title="@string/action_search"/>    <item android:id="@+id/action_compose"          android:icon="@drawable/ic_action_compose"          android:title="@string/action_compose" /></menu>


在activity的onCreateOptionsMenu()方法中,載入上面的布局

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu items for use in the action bar    MenuInflater inflater = getMenuInflater();    inflater.inflate(R.menu.main_activity_actions, menu);    return super.onCreateOptionsMenu(menu);}

運行後效果如下:




但是我們的需求是action item直接顯示在actionBar上,而不是在action overflow中,因此需要在每個<item>中,添加showAsAction=“ifRoom”,那麼只要空間足夠,每個action item都將單獨顯示(不建議使用always),例如:

<menu xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >    <item android:id="@+id/action_search"          android:icon="@drawable/ic_action_search"          android:title="@string/action_search"          yourapp:showAsAction="ifRoom"  />    ...</menu>

效果如下:




如果希望action item同時顯示圖片和文字,我們只要修改showAsAction的值:

showAsAction="ifRoom|withText"

3.處理action items的點擊事件當使用者點擊action時,系統會調用activity的 onOptionsItemSelected()方法,通過調用MenuItem的getItemId()方法,得到<item> 中id屬性的值,就可以確定是哪個action被點擊:

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    // Handle presses on the action bar items    switch (item.getItemId()) {        case R.id.action_search:            openSearch();            return true;        case R.id.action_compose:            composeMessage();            return true;        default:            return super.onOptionsItemSelected(item);    }}private void openSearch(){System.out.println("action_search被點擊了");}private void composeMessage(){System.out.println("action_compose被點擊了");}

如果是使用fragment來inflate菜單,當使用者單擊action item時,系統會通過Fragment類的onCreateOptionsMenu()的回調,來調用onOptionsItemSelected()方法。但是,activity會先處理點擊事件,所以在activity的onOptionsItemSelected()中,要返回ture,activity中的fragments才有機會執行fragment的onCreateOptionsMenu()方法。


4.使用分隔的action bar

先上官方:


分隔的actionBar可以將action item置於螢幕底部。如何?呢?

1.如果API是14及以上,只需要在每個<activity> 或<application>中添加 android:uiOptions=“splitActionBarWhenNarrow" 

2.如果API是14以下,需要在每個<activity>中添加 <meta-data>,如下:


<manifest ...>    <activity uiOptions="splitActionBarWhenNarrow" ... >        <meta-data android:name="android.support.UI_OPTIONS"                   android:value="splitActionBarWhenNarrow" />    </activity></manifest>

如果要實現圖3中隱藏icon和title的效果,還需在activity中添加下面兩行代碼:

actionBar.setDisplayShowHomeEnabled(false) ;actionBar.setDisplayShowTitleEnabled(false);

5.使用ActionBar上的icon來導航可以將actionBar上的icon表徵圖來作為返回按鈕,就像iOS中的導覽列中的leftBarButtonItem,例如螢幕A顯示一個列表,選擇類表中的一項時,跳轉到螢幕B,螢幕B可以包含返回按鈕,來返回到螢幕A。

調用ActionBar執行個體的setDisplayHomeAsUpEnabled()方法即可顯示actionBar的返回按鈕(如下面代碼)。現在可以看見了返回表徵圖了。

actionBar.setDisplayHomeAsUpEnabled(true);

但是預設按了之後並沒有任何效果。因此還需要使用下面兩種方法的任何一種進行配置:

方法一。在manifest檔案中聲明上級activity

如果上級Activity是固定的,只需在manifest中聲明,使用者按了返回按鈕後,actionBar就會自動跳回對應的activity,在Android 4.1 (API level 16)開始,可以在<activity>中直接設定parentActivityName屬性來設定父activity,而在之前的版本中,添加一個<meta-data>元素來設定父activity:


<application ... >    ...    <!-- The main/home activity (has no parent activity) -->    <activity        android:name="com.example.myfirstapp.MainActivity" ...>        ...    </activity>    <!-- A child of the main activity -->    <activity        android:name="com.example.myfirstapp.DisplayMessageActivity"        android:label="@string/title_activity_display_message"        android:parentActivityName="com.example.myfirstapp.MainActivity" >        <!-- Parent activity meta-data to support API level 7+ -->        <meta-data            android:name="android.support.PARENT_ACTIVITY"            android:value="com.example.myfirstapp.MainActivity" />    </activity></application>

方法二。通過在Activity中overridegetSupportParentActivityIntent()和onCreateSupportNavigateUpTaskStack() 方法

這個方法適用於使用者可能是通過不同的activity跳轉到目前這個activity的情況,本文不做詳細介紹,可以看官方文檔:http://developer.android.com/training/implementing-navigation/ancestral.html



6.添加Action View

有時,簡單的button並不能滿足我們的需求,為了實現更多功能,我們還可以用action view.  action view是顯示在actionBar 上作為相當於action button的wedget,例如,如果需要搜尋功能,可以添加一個嵌入了SearchView widget的action view到actionBar中。是一個包含可摺疊搜尋欄的actionBar。



要聲明一個action view,分別使用actionLayout 和actionViewClass 屬性來說明需要使用的layout或者widget,例如,下面代碼添加了SearchView widget:

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:id="@+id/action_search"          android:icon="@drawable/ic_action_search"          android:title="@string/action_search"          android:showAsAction="ifRoom| collapseActionView"          android:actionViewClass="android.widget.SearchView" />   </menu>

如果要配置action view(例如添加監聽器),可以在onCreateOptionsMenu()中通過menu.findItem(R.id.action_search).getActionView()來擷取,例如:

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu items for use in the action bar    MenuInflater inflater = getMenuInflater();    inflater.inflate(R.menu.main_activity_actions, menu);        SearchView searchItem = (SearchView) menu.findItem(R.id.action_search).getActionView();    //進行SearchView的設定,例如設定監聽器等...        return super.onCreateOptionsMenu(menu);}

其中關於SearchView控制項的使用不在本文範圍,可以參考官方文檔:http://developer.android.com/guide/topics/search/search-dialog.html


由於篇幅關係,《ActionBar的使用(1)》先講到這裡,下一篇《ActionBar的使用(2)》將繼續介紹ActionBar的其它用法(Action Provider、Navigation Tabs、Drop-down Navigation等),希望大家繼續關注,我將儘快更新。



【Android】ActionBar的使用(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.