自從Android3.0(API 11)把ActionBar加入到android sdk後,其在安卓UI佈局中的地位便一路上升。經過安卓的官方文檔能夠看出,ActionBar的出現旨在爲用戶提供一個更加簡潔和友好的UI框架。同時開發者經過採用ActionBar也能夠得到諸多好處(好比APP在高版本安卓系統中更好的穩定性)。html
對於Andorid3.0(API11)及以上的系統,使用ActionBar只須要設置兩個地方便可java
AndroidManifest.xmlandroid
<manifest ... > <uses-sdk android:minSdkVersion="11" ... /> ... </manifest>
以及segmentfault
<activity android:theme="@style/Theme.Holo" ... >
可是在平時的開發中,通常都要考慮APP的低版本適配問題,那麼在Android3.0(API11)如下的的sdk中,該如何使用ActionBar呢?好在安卓爲咱們提供了支持包Android Support Library,該支持包能夠經過Android SDK Manager下載
下載完成後在sdk安裝路徑下能夠看到/extras/android/v7/appcompat這個項目,它就是低版本sdk使用ActionBar的支持包。(Andorid Support Library詳細的使用說明請查看谷歌說明文檔)。
安裝完appcompat後,下面就是要在項目的代碼中使用它了。
1.任何須要使用ActionBar的activity都要繼承ActionBarActivity這個類微信
public class YourActivity extends ActionBarActivity {...}
2.activity(或者application)的主題都要繼承Theme.AppCompatapp
<activity android:theme="@style/Theme.AppCompat.Light" ... >
3.APP版本兼容至(最低)Android2.1(API7)框架
<manifest ... > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" /> ... </manifest>
至此,項目就已經使用ActionBar了,接下來就是如何定義ActionBar的功能按鈕。
首先來看下一個標準的ActionBar長什麼樣
經過圖片能夠看出,一個ActionBar大體能夠分紅兩部分,左側的圖標和Activity標籤,右側是一些能夠自定義的功能按鈕。其中修改左側的圖標和標籤比較簡單,只要在AndroidManifest.xml文件裏修改便可。下面就來看看如何修改右側的功能按鈕,從而把咱們想要的操做加到ActionBar上面。
1.在/res/menu文件夾裏新建一個菜單定義文件,好比ide
/res/menu/main_activity_actions.xml佈局
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- Search, should appear as action button --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" android:showAsAction="ifRoom" /> <!-- Settings, should always be in the overflow --> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:showAsAction="never" /> </menu>
在上面的文件中,咱們定義了一個搜索和一個設置共兩個菜單項。在定義文件中,若是一個菜單項設置了android:icon屬性,那麼在ActionBar中就會顯示該屬性指向的drawable資源,若是android:icon屬性沒有被設置,那麼默認就會顯示android:title指向的字符串。對於android:showAsAction屬性(該屬性有五個能夠設定的值——ifRoom,withText,never,always,collapseActionView,詳細說明請戳這裏),若是設置爲ifRoom,那麼系統在顯示該菜單項時作個判斷,判斷ActionBar右側是否有足夠的空間放置這個按鈕,若是設置爲never,那麼這裏會因系統版本不一樣而致使顯示的方式有所差別。在高版本系統(測試版本爲4.3)中,ActionBar的最右側會自動添加一個按鈕overflow,也就是上面圖片中豎排的三個點。經過點擊overflow按鈕,android:showAsAction屬性設置爲never的菜單項就會如下拉的方式顯示出來。但在低版本系統(測試版本爲2.2)中,系統是沒有添加這個overflow按鈕的。
因此項目中對低版本的適配須要注意到這一點學習
2.在Activity中調用onCreateOptionsMenu(Menu menu)方法解析menu文件
@Override public 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); }
3.定義各個菜單項的動做
@Override public 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_settings: openSettings(); return true; default: return super.onOptionsItemSelected(item); } }
在微信5.2安卓客戶端中,你們在使用時應該都注意到了一個特性,那就是無論當前活動界面是在哪一個Activity上面,經過點擊左上角的圖標或者標籤就能夠返回到上一層的Activity。這一特性就是ActionBar帶來的。那麼如何實現呢?
1.在AndroidManifest.xml文件中聲明Activity的android:parentActivityName屬性
<application ... > ... <!-- The main/home activity (it 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 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application>
android:parentActivtyName屬性聲明的值就是點擊ActionBar左側圖標所返回的Activity同時,爲了支持4.0如下的版本須要多添加一些數據
<!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" />
2.在activity的onCreate(Bundle savedInstanceState)方法調用setDisplayHomeAsUpEnabled()方法
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_displaymessage); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 若是不須要支持Android3.0(API11)如下的版本,則能夠調用 // getActionBar().setDisplayHomeAsUpEnabled(true); }
經過ActionBar和Activities的樹狀結構相結合,APP內的Activities結合的更加緊密。其實這也是ActionBar的最大的魅力所在。對於開發者來講,至少能夠省掉一個後退按鈕。對於用戶來講,實時的顯示Activities標籤能夠幫助用戶定位當前APP運行的位置,以及ActionBar這個UI框架普及後,用戶的學習成本也會下降。