明明白白Android平臺的Action Bar
Action Bar是什么?
很長一段時間內,開發人員一直在為他們的Android應用程序設計功能標題欄,Android 3.0正式引入了Action Bar部件,規范了應用程序導航設計,一些新的Android設備,如平板電腦也拋棄了傳統的導航功能,使用軟件按鈕取代了物理主屏、菜單、后退和搜索按鈕。
Action Bar的概念非常簡單,如果你的應用程序有一個“選項”菜單,當用戶點擊“菜單”按鈕時,出現一個活動項目菜單,你的應用程序可以利用Android 3.0中的Action Bar功能,它修改了應用程序標題欄,以一種易于使用的方式顯示那些先前在“選項”菜單中的活動,如圖1所示。
圖 1 蜂巢設備上的Action Bar
Action Bar有哪些行為?
最棘手的是運行蜂巢及更高版本的設備顯示不同Action Bar功能時,取決于應用程序的目標SDK是設置為蜂巢還是傳統的API級別。
我們來看一個簡單的例子,假設我們的應用程序包含四個屏幕:一個主Activity和三個“清潔的”Activity(打掃、擦洗和吸塵),我們向主Activity添加一個選項菜單,以便讓用戶跳轉到另三個Activity,如圖2所示。
圖 2 帶有一個選項菜單和四個屏幕的簡單應用程序
該應用程序兩個基本的組件是選項菜單資源文件和主Activity類,其它Activity類只是簡單地顯示一個ImageView和一個TextView控件,選項菜單資源文件簡單定義了選項菜單項,其內容如下:
- <?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類將這個菜單資源作為一個選項菜單載入,并定義了每個選項菜單項的onClick處理程序,其內容如下:
- 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));
- }
- }
到現在為止我們沒有做任何事情,因此我們在技術上并不需要將應用程序的Android清單文件設置為高目標API級別,我們這里將其設置為API級別9。
- <uses-sdk android:minSdkVersion="9" />
當我們在蜂巢設備上運行這個“傳統的”應用程序時,系統欄會顯示一個像網格的圖標(第四個),它和傳統Android手機上的“菜單”按鈕所起的作用是等同的,只不過它變成一個軟件按鈕了,點擊它將會顯示選項菜單,就好像是在一部老式智能手機上一樣,如圖3所示,屏幕頂部的標題欄僅僅顯示了應用程序的標題。
圖 3 在蜂巢設備上的傳統應用程序行為
如果我們修改應用程序Android清單文件的目標API級別,將其設為API級別11(蜂巢),應用程序將自動應用Action Bar機制。
- <uses-sdk android:minSdkVersion="11" />
默認情況下,標題欄顯示了應用程序圖標,名稱和所謂的溢出菜單圖標,點擊這個圖標會彈出一個文本菜單,列出選項菜單項,如圖4所示。
圖 4 蜂巢設備上的蜂巢應用程序行為
自定義你的Action Bar
當你的應用程序目標設為蜂巢平臺時,你可以利用Action Bar部件提供的全部功能,將你的選項菜單項放在Action Bar的右上角,對用戶來說使用更方便,控制該行為的主菜單項屬性是android:showAsAction。
這個屬性可接受的值有:
1、always:這個值會使菜單項一直顯示在Action Bar上。
2、ifRoom:如果有足夠的空間,這個值會使菜單項顯示在Action Bar上。
3、never:這個值使菜單項永遠都不出現在Action Bar上。
4、withText:這個值使菜單項和它的圖標,菜單文本一起顯示。
我們修改選項菜單資源文件來看看這個屬性的不同使用效果,首先,如果你還記得圖1的內容,不記得就返回到前面重新觀察一下,你就會發現,Action Bar中顯示了每個菜單項的圖標和它們的名稱,換句話說就是,每個菜單項目有以下屬性:
- android:showAsAction="ifRoom|withText"
另一個合理的設置是顯示Action Bar上的每個菜單項,只要有空間,但沒有雜亂的文字,換句話說就是,每個菜單項有以下屬性:
- android:showAsAction="ifRoom"
圖5顯示了這個變化在典型蜂巢設備上的效果。
圖 5 當空間足夠時,在Action Bar上顯示菜單項,包括文本
***,如果我們不想讓Vacuum菜單項顯示在Action Bar上,其屬性值就應該是:
- android:showAsAction="never"
這樣在Action Bar上將只會顯示兩個菜單項:Sweep和Scrub。在右上角,你會再次看到溢出菜單,點擊它就會看到被設為“never”的菜單項,如Vacuum,以及其它不適合放在Action Bar上的菜單項,如圖6所示。
圖 6 在Action Bar上顯示部分菜單項,其它菜單項永遠不顯示(顯示在溢出菜單中)
- <?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上的應用程序圖標點擊行為
Action Bar的另一個功能是用戶可以點擊左上角的應用程序圖標,雖然默認情況下點擊行為沒有任何反應,但如果增加一個自定義“主屏幕”功能,或關聯到你的啟動屏幕,那樣操作起來更有趣。
假設你想更新ScrubActivity類中的默認Action Bar,以便點擊應用程序圖標時用戶可以返回到主Activity(同時清空Activity stack)。
實現起來也很簡單,你只需要為ScrubActivity類實現onOptionsItemSelected()方法,并處理特定的菜單項標識符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);
- }
- }
就這么簡單,你也可以在應用程序圖標的左邊顯示一個箭頭,在你Activity的onCreate()方法中聯合使用setDisplayHomeAsUpEnabled()方法,可以返回到指定的屏幕。
- ActionBar bar = getActionBar();
- bar.setDisplayHomeAsUpEnabled(true);
如圖7所示,我們在Sweep屏幕上啟用了這個功能,在Action Bar上增加了一個箭頭小圖標。
圖 7 帶有可點擊的主屏幕按鈕和一個返回箭頭的Action Bar
使用不需要Action Bar的屏幕
當你將應用程序目標設為API 11或更高時,你的所有屏幕默認都將擁有Action Bar,如果你不想用這個新部件,有幾種方法可以移除它,最簡單的方法可能是通過編程手段直接在Activity類中關閉它,例如,我們可以用下面兩行代碼關閉Vacuum屏幕上的Action Bar,只需要將這兩行代碼添加到Activity類的onCreate()方法中即可。
- ActionBar bar = getActionBar();
- bar.hide();
這兩行代碼將移除屏幕頂部的整個Action Bar,應用程序名稱也不會顯示了,你也可以隱藏Action Bar,在布局文件中創建一個特殊的自定義主題即可,詳細情況請閱讀Android SDK文檔。
Action Bar的高級功能
本文只是對Action Bar做了簡單的介紹,可以說只觸及了它的表面,Action Bar是支持樣式的,包括修改背景圖像和其它自定義屬性,它們也支持多個其它成熟的視圖類型和部件,不僅僅是那些在選項菜單中的菜單項,如標簽和下來列表,你甚至可以增加其它類型的視圖控件,創建Action Bar功能區域,詳細情況請閱讀Android SDK文檔。
小結
如果你的應用程序已經使用了選項菜單,當你把目標設為蜂巢設備時,你可以利用Action Bar的所有功能,就像向你的菜單布局文件增加一些新屬性一樣簡單。每個屏幕的Action Bar都是可定制的,作為開發人員,你可以控制顯示哪個項目,以及如何顯示,當你想留更多的屏幕顯示游戲畫面等內容時,你甚至可以移除整個Action Bar。
原文出處:http://www.informit.com/articles/article.aspx?p=1743642