標籤:android actionbar 適配2.x
概述:
在Honeycomb版本系統中,Android引入了全新的操作欄。操作欄不僅取代了顯示標題和應用表徵圖的傳統標題列(title bar),還帶來了更多其他的功能,例如,安置菜單選項、配置應用表徵圖作為導覽按鈕,等等。——《Android編程權威指南》
優點:
1.使用方便,避免開發人員重複製造輪子。
2.架構成熟,不需要開發人員再去做多餘的適配不同解析度及片段化最佳化操作。
正常使用(API14及以上):代碼及思路分析:
正常情況下的我們是通過Java代碼和xml程式碼群組合來編寫actionbar。
xml檔案如下:
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_compose" android:icon="@drawable/delete_button_normal" android:showAsAction="always" android:title="@string/action_compose"/> <item android:id="@+id/action_delete" android:icon="@drawable/delete_button_normal" android:showAsAction="always" android:title="@string/action_delete"/> <item android:id="@+id/action_settings" android:icon="@drawable/delete_button_normal" android:showAsAction="always" android:title="@string/action_settings"/></menu>
定義3個item,設定其showAsAction屬性為always.
關於showAsAction屬性的值有以下幾個:
always: 這個值會使功能表項目一直顯示在Action Bar上
ifRoom: 如果有足夠的空間,這個值會使功能表項目顯示在Action Bar上
never: 這個值使功能表項目永遠都不出現在Action Bar上
withText: 這個值使功能表項目和它的表徵圖,菜單文本一起顯示
看到上面的標籤為menu,就應該知道了,到上面在java代碼中是通過菜單來實現了。主要的方法是onCreateOptionsMenu,如下:
public boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu, menu);return true;}
為了去響應左邊的返回鍵(箭頭)和Home需要我們在代碼做以下邏輯:
ActionBar bar = getActionBar();bar.setHomeButtonEnabled(true);bar.setDisplayHomeAsUpEnabled(false);bar.setDisplayShowHomeEnabled(true);
還有一點就是Home的表徵圖,我們可以在manifest的activity標籤中去設定,如下:
<activity android:name="com.actionbar.activity.MainActivity" android:label="@string/action_bar_title" android:logo="@drawable/back_button_normal" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
實現效果展示:
註:有時候我們在螢幕足夠大的時候還是會在最左側出現一個小箭頭,那麼如何除掉Actionbar最左側的箭頭呢?可以點擊這裡查看解決方案。
適配2.x版本:代碼及思路分析:
對於上面的邏輯方法只是可以在API 14及以上的系統上實現。那麼API 14以下的系統要怎麼去實現同樣的效果呢?在官方出台新的解決方案之前,就有一些大神開始研究且開發出了一套架構——ActionBarSherlock。當然目前Google已經就這個問題提供了一個新的解決方案——android-support-v7-appcompat。我們可以讓我們的Activity繼承自ActionBarActivity,不過不擔心這個ActionBarActivity會對代碼有沒有什麼不良的影響,因為它是繼承自FragmentActivity。
那麼要怎麼實現呢?我們需要引入一個工具包:android-support-v7-appcompat,並在Android的項目中匯入它。是不是到這裡就已經大功告成了呢?運行程式後,我們發現並非如此。可是,在基有的代碼上我們沒有發現任何蛛絲馬跡,那我們要怎麼去修改這個Bug呢?google吧,孩子。
後來我們發現我們不能再使用靜態xml代碼來建立它了。我們只能動態在Java代碼中通過Java代碼動態產生Item,如下:
public boolean onCreateOptionsMenu(Menu menu) {//MenuInflater inflater = getMenuInflater();//inflater.inflate(R.menu.menu, menu);//return super.onCreateOptionsMenu(menu);MenuCompat.setShowAsAction(menu.add("First").setIcon(android.R.drawable.btn_star), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);MenuCompat.setShowAsAction(menu.add("Second").setIcon(android.R.drawable.ic_menu_rotate), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);return true;}注釋掉的部分就是通過xml靜態地建立,事實證明是失敗的,需要動態來建立。
運行展示:
本人文筆拙劣,可能會有一些表述不夠清晰。更詳細的代碼和細節請在下面的源碼串連中去下載查看。還有一點需要注意,如果你的測試機是魅族系列,可能有些地方不能很好適配,請更換測試機重新測試或將屬性參數改為SHOW_AS_ACTION_ALWAYS(我用的也是魅族)。
源碼下載:
http://download.csdn.net/detail/u013761665/8737119
Android控制項ActionBar淺析及適配2.x的方法介紹