《Android》『ActionBar』- ActionBar 的靜態與動態宣告方式
《Android Developers 參考文獻》
《簡單介紹》
所謂的 Action Bar,在 android 中就像是 windows 裡點開每個資料夾時,橫列於資料夾上方的工具列,通常我們會用來放置類似檔案總管的功能選項或者是設定介面的控制選項,透過在 Action Bar 上顯示的介面操作元件,進一步提升程式操作的便利性。
※從 Android 3.0 (API 級別 11) 開始,提供 Android 的裝置不再需要提供專屬的「選單」按鈕。 有此變更之後,Android 應用程式應可脫離對傳統有 6 個項目的選單面板的依賴,改為提供動作列來呈現一般的使用者動作。
《Action Bar 的使用條件》
Action Bar 是在 android 3.0 以後才加入的功能,因此在使用時必須確認程式專案的 AndroidManifest.xml 中所設定的 minSdkVersion 值大於 11 (android 3.0 的版本編號),不然會有語法錯誤提示。
《Action Bar 的顯示設定》
我們可以透過 getActionBar() 的方式,直接於程式中對 Action Bar 介面做設定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
. . . public class MainActivity extends Activity { private ActionBar mActionBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init() { mActionBar = getActionBar(); //取得Activity的ActionBar mActionBar.setDisplayShowTitleEnabled(false); //false : 隱藏程式標題 mActionBar.setDisplayUseLogoEnable(true); //true : 允許改變成式的小圖示 mActionBar.show(); //顯示ActionBar mActionBar.hide(); //隱藏ActionBar } } . . . |
直接於程式中對 Action Bar 介面做設定
其中當我們設定 setDisplayUseLogoEnable(true) 的時候,需搭配修改 AndroidManifest.xml 檔案,將所要使用的自訂圖案於其中設定好,相關程式碼片段如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?xml version="1.0" encoding="utf-8"?> <manifest ...> <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="17" /> <application android:icon="@drawable/app_logo"> . <activity>...</activity> . </application> </manifest> |
Androidmanifest.xml
此範例中,app_logo為我們自己定義的圖案,將之設定到<application>標籤中的 icon 即可。
《Option Menu 與 Action Item》
Action Bar 是由 Action Item 所組成,而 Action Item 是什麼呢?先來說說與它息息相關的 Option Menu,Option Menu 就是 android 程式的功能表選單,會在手機按下 Menu 鍵時出現在螢幕下方,而除了透過 Menu 鍵呼叫之外,我們通常會把於 Option Menu 中最常用的選項直接放置於 Action Bar 中,而這些放在 Action Bar 中的 Option Menu 選項,便稱為 Action Item。
※ Option Menu 的使用限制 :
選單最多只有兩層,且只能顯示文字。
《Option Menu 的建立與使用方式》
Option Menu 的建立方式有兩種,分別是靜態建立與動態建立,其中靜態建立就是將選單選項直接定義在 res/menu 資料夾下的 .xml 格式檔中,而動態建立則是利用程式碼在 Menu 物件中逐一加入選單中的項目。不管是用哪一種方式建立,在建立過程中,我們都需要重新覆寫 onCreateOptionsMenu() 與 onOptionsItemSelected() 這兩個狀態處理方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
. . . private static final int MENU_ITEM_1 = Menu.FIRST; private static final int MENU_ITEM_2 = Menu.FIRST + 1; private static final int MENU_ITEM_3 = Menu.FIRST + 2; private static final int MENU_ITEM_4 = Menu.FIRST + 3; @Override public boolean onCreateOptionsMenu(Menu menu) { //在此定義MENU選單選項 menu.add(0, MENU_ITEM_1, 0, "MenuItem1");//(群組ID, 選項ID, 選項排列順序, 選項名稱) menu.add(0, MENU_ITEM_2, 1, "MenuItem2");//(群組ID, 選項ID, 選項排列順序, 選項名稱) subMenu subMenu = menu.addSubMenu(0, MENU_ITEM_1, 0, "MenuItem1's subMenu"); subMenu.add(0, MENU_ITEM_3, 0, "MenuItem3");//(群組ID, 選項ID, 選項排列順序, 選項名稱) subMenu.add(0, MENU_ITEM_4, 1, "MenuItem4");//(群組ID, 選項ID, 選項排列順序, 選項名稱) return true; } . . . @Override public boolean onOptionsItemSelected(MenuItem item) { //當使用者點選MENU中的選項後,觸發此狀態事件 switch (item.getItemId()) { case MENU_ITEM_1: ... break; case MENU_ITEM_2: ... break; case MENU_ITEM_3: ... break; case MENU_ITEM_4: ... break; } return super.onOptionsItemSelected(item); } |
動態建立 Option Menu 選單
當使用者按下 Menu 鍵時,系統會自動呼叫 onCreateOptionsMenu() 方法,並傳入一個 Menu 物件,透過 add() 與 addSubMenu()的方式,讓程式建立選單。建立好選單以後,當使用者點選其中某一個選項時,便會觸發 onOptionsItemSelected() 方法,並傳入使用者點選的項目,因此在這個方法內我們可以透過傳來的參數,讓程式執行對應的程式碼。
動態建立選單的好處是,可以在程式執行的過程中,更靈活的控制現有選單的內容,動態改變選單中的項目,但不可避免的會增加程式的長度,因此若是我們確定程式的選單是不會變動的,便可裡使用靜態建立的方式,來簡化程式碼。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:title="MenuItem1" > <menu> <item android:id="@+id/menuItem3" android:title="MenuItem3" /> <item android:id="@+id/menuItem4" android:title="MenuItem4" /> </menu> </item> <item android:id="@+id/menuItem2" android:title="MenuItem2" android:icon="@android:drawable/ic_menuItem2" android:showAsAction="ifRoom" /> </menu> |
在 res/menu 資料夾下,自訂名稱為 main_menu.xml 的格式檔
這邊要來說明一下 android:showAsAction=”ifRoom” 這個屬性,ifroom 代表若是 Action Bar 上還有空間,我們便會把這個選項從 Option Menu 中抽出來變成 Action Item,且預設會用圖片的方式顯示(icon),若是要加上項目名稱(title),再加上 withText 屬性即可。
android:showAsAction=[“ifRoom” | “never” | “withText” | “always” | “collapseActionView”]
ifRoom – 如果有空間則顯示該按鈕。
withText – 顯示文字。
never – 不將按鈕顯示在 ActionBar 上。
always – 總是將按鈕顯示在 ActionBar 上。
collapseActionView – 將按鈕組合到 ActionBar 中。
此設定亦可於程式碼中動態設定,範例如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
. . @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); MenuItem menuItem = menu.findItem(R.id.menuItem1); //取得選項的 MenuTtem 物件 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT) return super.onCreateOptionsMenu(menu) } . . . |
於程式碼中動態設定 android:showAsAction = “ifRoom|withText” 屬性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
. . . @Override public boolean onCreateOptionsMenu(Menu menu) { //在此定義MENU選單選項 MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); return super.onCreateOptionsMenu(menu) } . . . @Override public boolean onOptionsItemSelected(MenuItem item) { //當使用者點選MENU中的選項後,觸發此狀態事件 switch (item.getItemId()) { case R.id.menuItem2: ... break; case R.id.menuItem3: ... break; case R.id.menuItem4: ... break; } return super.onOptionsItemSelected(item); } |
靜態建立 Option Menu 選單
當使用靜態建立選單的方式時,我們透過 getMenuInflater().inflate(),我們將已建立好的格式檔直接指定給 menu,在 onOptionsItemSelected() 方法中亦改用R.id 來區分所點選的選項,所呈現的程式碼略有不同,但基本上還是大同小異。
延伸閱讀:
臉書留言
一般留言