明明白白Android平臺(tái)的Action Bar
Action Bar是什么?
很長(zhǎng)一段時(shí)間內(nèi),開發(fā)人員一直在為他們的Android應(yīng)用程序設(shè)計(jì)功能標(biāo)題欄,Android 3.0正式引入了Action Bar部件,規(guī)范了應(yīng)用程序?qū)Ш皆O(shè)計(jì),一些新的Android設(shè)備,如平板電腦也拋棄了傳統(tǒng)的導(dǎo)航功能,使用軟件按鈕取代了物理主屏、菜單、后退和搜索按鈕。
Action Bar的概念非常簡(jiǎn)單,如果你的應(yīng)用程序有一個(gè)“選項(xiàng)”菜單,當(dāng)用戶點(diǎn)擊“菜單”按鈕時(shí),出現(xiàn)一個(gè)活動(dòng)項(xiàng)目菜單,你的應(yīng)用程序可以利用Android 3.0中的Action Bar功能,它修改了應(yīng)用程序標(biāo)題欄,以一種易于使用的方式顯示那些先前在“選項(xiàng)”菜單中的活動(dòng),如圖1所示。
圖 1 蜂巢設(shè)備上的Action Bar
Action Bar有哪些行為?
最棘手的是運(yùn)行蜂巢及更高版本的設(shè)備顯示不同Action Bar功能時(shí),取決于應(yīng)用程序的目標(biāo)SDK是設(shè)置為蜂巢還是傳統(tǒng)的API級(jí)別。
我們來看一個(gè)簡(jiǎn)單的例子,假設(shè)我們的應(yīng)用程序包含四個(gè)屏幕:一個(gè)主Activity和三個(gè)“清潔的”Activity(打掃、擦洗和吸塵),我們向主Activity添加一個(gè)選項(xiàng)菜單,以便讓用戶跳轉(zhuǎn)到另三個(gè)Activity,如圖2所示。
圖 2 帶有一個(gè)選項(xiàng)菜單和四個(gè)屏幕的簡(jiǎn)單應(yīng)用程序
該應(yīng)用程序兩個(gè)基本的組件是選項(xiàng)菜單資源文件和主Activity類,其它Activity類只是簡(jiǎn)單地顯示一個(gè)ImageView和一個(gè)TextView控件,選項(xiàng)菜單資源文件簡(jiǎn)單定義了選項(xiàng)菜單項(xiàng),其內(nèi)容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <menu
- xmlns:android=">http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/sweep"
- android:icon="@drawable/ic_menu_sweep"
- android:title="@string/sweep"
- android:onClick="onOptionSweep" />
- <item
- android:id="@+id/scrub"
- android:icon="@drawable/ic_menu_scrub"
- android:title="@string/scrub"
- android:onClick="onOptionScrub" />
- <item
- android:id="@+id/vacuum"
- android:icon="@drawable/ic_menu_vac"
- android:title="@string/vacuum"
- android:onClick="onOptionVacuum" />
- </menu>
主Activity類將這個(gè)菜單資源作為一個(gè)選項(xiàng)菜單載入,并定義了每個(gè)選項(xiàng)菜單項(xiàng)的onClick處理程序,其內(nèi)容如下:
- package com.mamlambo.actonthis;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- public class ActOnThisActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.cleaningoptions, menu);
- return true;
- }
- public void onOptionSweep(MenuItem i)
- {
- startActivity(new Intent(this, SweepActivity.class));
- }
- public void onOptionScrub(MenuItem i)
- {
- startActivity(new Intent(this, ScrubActivity.class));
- }
- public void onOptionVacuum(MenuItem i)
- {
- startActivity(new Intent(this, VacuumActivity.class));
- }
- }
到現(xiàn)在為止我們沒有做任何事情,因此我們?cè)诩夹g(shù)上并不需要將應(yīng)用程序的Android清單文件設(shè)置為高目標(biāo)API級(jí)別,我們這里將其設(shè)置為API級(jí)別9。
- <uses-sdk android:minSdkVersion="9" />
當(dāng)我們?cè)诜涑苍O(shè)備上運(yùn)行這個(gè)“傳統(tǒng)的”應(yīng)用程序時(shí),系統(tǒng)欄會(huì)顯示一個(gè)像網(wǎng)格的圖標(biāo)(第四個(gè)),它和傳統(tǒng)Android手機(jī)上的“菜單”按鈕所起的作用是等同的,只不過它變成一個(gè)軟件按鈕了,點(diǎn)擊它將會(huì)顯示選項(xiàng)菜單,就好像是在一部老式智能手機(jī)上一樣,如圖3所示,屏幕頂部的標(biāo)題欄僅僅顯示了應(yīng)用程序的標(biāo)題。
圖 3 在蜂巢設(shè)備上的傳統(tǒng)應(yīng)用程序行為
如果我們修改應(yīng)用程序Android清單文件的目標(biāo)API級(jí)別,將其設(shè)為API級(jí)別11(蜂巢),應(yīng)用程序?qū)⒆詣?dòng)應(yīng)用Action Bar機(jī)制。
- <uses-sdk android:minSdkVersion="11" />
默認(rèn)情況下,標(biāo)題欄顯示了應(yīng)用程序圖標(biāo),名稱和所謂的溢出菜單圖標(biāo),點(diǎn)擊這個(gè)圖標(biāo)會(huì)彈出一個(gè)文本菜單,列出選項(xiàng)菜單項(xiàng),如圖4所示。
圖 4 蜂巢設(shè)備上的蜂巢應(yīng)用程序行為
自定義你的Action Bar
當(dāng)你的應(yīng)用程序目標(biāo)設(shè)為蜂巢平臺(tái)時(shí),你可以利用Action Bar部件提供的全部功能,將你的選項(xiàng)菜單項(xiàng)放在Action Bar的右上角,對(duì)用戶來說使用更方便,控制該行為的主菜單項(xiàng)屬性是android:showAsAction。
這個(gè)屬性可接受的值有:
1、always:這個(gè)值會(huì)使菜單項(xiàng)一直顯示在Action Bar上。
2、ifRoom:如果有足夠的空間,這個(gè)值會(huì)使菜單項(xiàng)顯示在Action Bar上。
3、never:這個(gè)值使菜單項(xiàng)永遠(yuǎn)都不出現(xiàn)在Action Bar上。
4、withText:這個(gè)值使菜單項(xiàng)和它的圖標(biāo),菜單文本一起顯示。
我們修改選項(xiàng)菜單資源文件來看看這個(gè)屬性的不同使用效果,首先,如果你還記得圖1的內(nèi)容,不記得就返回到前面重新觀察一下,你就會(huì)發(fā)現(xiàn),Action Bar中顯示了每個(gè)菜單項(xiàng)的圖標(biāo)和它們的名稱,換句話說就是,每個(gè)菜單項(xiàng)目有以下屬性:
- android:showAsAction="ifRoom|withText"
另一個(gè)合理的設(shè)置是顯示Action Bar上的每個(gè)菜單項(xiàng),只要有空間,但沒有雜亂的文字,換句話說就是,每個(gè)菜單項(xiàng)有以下屬性:
- android:showAsAction="ifRoom"
圖5顯示了這個(gè)變化在典型蜂巢設(shè)備上的效果。
圖 5 當(dāng)空間足夠時(shí),在Action Bar上顯示菜單項(xiàng),包括文本
***,如果我們不想讓Vacuum菜單項(xiàng)顯示在Action Bar上,其屬性值就應(yīng)該是:
- android:showAsAction="never"
這樣在Action Bar上將只會(huì)顯示兩個(gè)菜單項(xiàng):Sweep和Scrub。在右上角,你會(huì)再次看到溢出菜單,點(diǎn)擊它就會(huì)看到被設(shè)為“never”的菜單項(xiàng),如Vacuum,以及其它不適合放在Action Bar上的菜單項(xiàng),如圖6所示。
圖 6 在Action Bar上顯示部分菜單項(xiàng),其它菜單項(xiàng)永遠(yuǎn)不顯示(顯示在溢出菜單中)
- <?xml version="1.0" encoding="utf-8"?>
- <menu
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/sweep"
- android:icon="@drawable/ic_menu_sweep"
- android:title="@string/sweep"
- android:onClick="onOptionSweep" />
- <item
- android:id="@+id/scrub"
- android:icon="@drawable/ic_menu_scrub"
- android:title="@string/scrub"
- android:onClick="onOptionScrub" />
- <item
- android:id="@+id/vacuum"
- android:icon="@drawable/ic_menu_vac"
- android:title="@string/vacuum"
- android:onClick="onOptionVacuum" />
- </menu>
處理Action Bar上的應(yīng)用程序圖標(biāo)點(diǎn)擊行為
Action Bar的另一個(gè)功能是用戶可以點(diǎn)擊左上角的應(yīng)用程序圖標(biāo),雖然默認(rèn)情況下點(diǎn)擊行為沒有任何反應(yīng),但如果增加一個(gè)自定義“主屏幕”功能,或關(guān)聯(lián)到你的啟動(dòng)屏幕,那樣操作起來更有趣。
假設(shè)你想更新ScrubActivity類中的默認(rèn)Action Bar,以便點(diǎn)擊應(yīng)用程序圖標(biāo)時(shí)用戶可以返回到主Activity(同時(shí)清空Activity stack)。
實(shí)現(xiàn)起來也很簡(jiǎn)單,你只需要為ScrubActivity類實(shí)現(xiàn)onOptionsItemSelected()方法,并處理特定的菜單項(xiàng)標(biāo)識(shí)符android.R.id.home即可,例如:
- @Override
- public boolean onOptionsItemSelected(MenuItem item)
- {
- switch (item.getItemId())
- {
- case android.R.id.home:
- Intent intent = new Intent(this, ActOnThisActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
就這么簡(jiǎn)單,你也可以在應(yīng)用程序圖標(biāo)的左邊顯示一個(gè)箭頭,在你Activity的onCreate()方法中聯(lián)合使用setDisplayHomeAsUpEnabled()方法,可以返回到指定的屏幕。
- ActionBar bar = getActionBar();
- bar.setDisplayHomeAsUpEnabled(true);
如圖7所示,我們?cè)赟weep屏幕上啟用了這個(gè)功能,在Action Bar上增加了一個(gè)箭頭小圖標(biāo)。
圖 7 帶有可點(diǎn)擊的主屏幕按鈕和一個(gè)返回箭頭的Action Bar
使用不需要Action Bar的屏幕
當(dāng)你將應(yīng)用程序目標(biāo)設(shè)為API 11或更高時(shí),你的所有屏幕默認(rèn)都將擁有Action Bar,如果你不想用這個(gè)新部件,有幾種方法可以移除它,最簡(jiǎn)單的方法可能是通過編程手段直接在Activity類中關(guān)閉它,例如,我們可以用下面兩行代碼關(guān)閉Vacuum屏幕上的Action Bar,只需要將這兩行代碼添加到Activity類的onCreate()方法中即可。
- ActionBar bar = getActionBar();
- bar.hide();
這兩行代碼將移除屏幕頂部的整個(gè)Action Bar,應(yīng)用程序名稱也不會(huì)顯示了,你也可以隱藏Action Bar,在布局文件中創(chuàng)建一個(gè)特殊的自定義主題即可,詳細(xì)情況請(qǐng)閱讀Android SDK文檔。
Action Bar的高級(jí)功能
本文只是對(duì)Action Bar做了簡(jiǎn)單的介紹,可以說只觸及了它的表面,Action Bar是支持樣式的,包括修改背景圖像和其它自定義屬性,它們也支持多個(gè)其它成熟的視圖類型和部件,不僅僅是那些在選項(xiàng)菜單中的菜單項(xiàng),如標(biāo)簽和下來列表,你甚至可以增加其它類型的視圖控件,創(chuàng)建Action Bar功能區(qū)域,詳細(xì)情況請(qǐng)閱讀Android SDK文檔。
小結(jié)
如果你的應(yīng)用程序已經(jīng)使用了選項(xiàng)菜單,當(dāng)你把目標(biāo)設(shè)為蜂巢設(shè)備時(shí),你可以利用Action Bar的所有功能,就像向你的菜單布局文件增加一些新屬性一樣簡(jiǎn)單。每個(gè)屏幕的Action Bar都是可定制的,作為開發(fā)人員,你可以控制顯示哪個(gè)項(xiàng)目,以及如何顯示,當(dāng)你想留更多的屏幕顯示游戲畫面等內(nèi)容時(shí),你甚至可以移除整個(gè)Action Bar。
原文出處:http://www.informit.com/articles/article.aspx?p=1743642