Android_低版本使用ActionBar

簡介

Android3.0纔開始支持ActionBar,那麼怎麼在低版本也能用ActionBar呢?

1、使用Google提供的Support Library(android-support-v7-appcompat)。

2、使用Jake Wharton編寫的ActionBarSherlock(http://actionbarsherlock.com/)。

以上兩個library的共同點:Android3.0以下,使用library,Android3.0以上,使用系統自帶的ActionBar

以上兩個library的不同點:android-support-v7-appcompat在Android3.0以下不支持Overflow按鈕,如果要使用Overflow按鈕,可以使用library裏面提供的PopupMenu。從ActionBarSherlock v4.2.0開始在Android3.0以下不支持Overflow按鈕,如果要使用Overflow按鈕,可以使用ActionBarSherlock v4.1.0,但是新版本有修正的一些bug。

由於兩個library的實裝方法一樣,那麼下面就只介紹android-support-v7-appcompat的使用。

android-support-v7-appcompat的使用

1、下載最新的SDK,然後找到裏面的sdk\extras\android\support\v7\appcompat導入到eclipse裏面。

2、右鍵裏的項目 - Properties - Android - Add - 選擇導入的appcompat項目,這樣就可以使自己的項目引用appcompat項目。

3、導入之後如果在控制檯提示有兩個android-support-v4.jar,原因是自己項目中的android-support-v4.jar和導入的appcompat項目的android-support-v4.jar重複了,刪掉自己項目中的android-support-v4.jar就OK了。

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. Found 2 versions of android-support-v4.jar in the dependency list,  
  2. but not all the versions are identical (check is based on SHA-1 only at this time).  
  3. All versions of the libraries must be the same at this time.  
  4. Versions found are:  
  5. Path: D:\Program Files\adt-bundle-windows-x86_64-20130917\eclipse\workspace\android-support-v7-appcompat\libs\android-support-v4.jar  
  6. <pre code_snippet_id="113243" snippet_file_name="blog_20131215_1_6735911" name="code" class="plain">    Length: 556198  
  7.     SHA-1: 4a6be13368bb64c5a0b0460632d228a1a915f58f  
  8. Path: D:\Program Files\adt-bundle-windows-x86_64-20130917\eclipse\workspace\NavigationDrawerDemo(android-support-v7-appcompat)\libs\android-support-v4.jar  
  9.     Length: 535319  
  10.     SHA-1: 3e1409c5f5c4cdf9fd41db4b22a3eec5b3b10d96  
  11. Jar mismatch! Fix your dependencies</pre>  
  12. <pre></pre>  
  13. <p></p>  
  14. <pre></pre>  

4、讓Activity繼承ActionBarActivity,並在activity標籤裏面添加主題<activity android:theme="@style/Theme.AppCompat.Light" ... >

5、使用到ActionBar的地方通過getSupportActionBar()方法來獲取ActionBar。

6、ActionBar的具體使用方法請參照http://blog.csdn.net/tianjf0514/article/details/13246075,再次就不再多作說明,下面具體說明使用library的一些不同的地方。

Menu的XML文件的寫法的不同

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android"  
  2.       xmlns:yourapp="http://schemas.android.com/apk/res-auto" >  
  3.     <item android:id="@+id/action_search"  
  4.           android:icon="@drawable/ic_action_search"  
  5.           android:title="@string/action_search"  
  6.           yourapp:showAsAction="ifRoom"  />  
  7.     ...  
  8. </menu>  

這是告訴系統,showAsAction使用library的XML attributes。

此外還有

yourapp:actionViewClass="android.support.v7.widget.SearchView"

yourapp:actionProviderClass="android.support.v7.widget.ShareActionProvider"

Up Navigation使用的不同

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <manifest ...>  
  2.     <activity uiOptions="splitActionBarWhenNarrow" ... >  
  3.         <meta-data android:name="android.support.UI_OPTIONS"  
  4.                    android:value="splitActionBarWhenNarrow" />  
  5.     </activity>  
  6. </manifest>  

android:uiOptions="splitActionBarWhenNarrow"表示使用系統的Up Navigation。

meta-data部分表示使用library的Up Navigation。

自己實現PopupMenu

menu.xml

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:yourapp="http://schemas.android.com/apk/res-auto" >  
  3.   
  4.     <item  
  5.         android:id="@+id/action_overflow"  
  6.         android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_light"  
  7.         android:title="@string/action_websearch"  
  8.         android:titleCondensed="@string/action_websearch"  
  9.         yourapp:showAsAction="ifRoom|withText"/>  
  10.   
  11. </menu>  

popup_menu.xml

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  2.   
  3.     <item  
  4.         android:icon="@drawable/action_search"  
  5.         android:title="@string/action_websearch"/>  
  6.     <item  
  7.         android:icon="@drawable/action_search"  
  8.         android:title="@string/action_websearch"/>  
  9.   
  10. </menu>  

MainActivity.java

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Override  
  2. public boolean onOptionsItemSelected(MenuItem item) {  
  3.     switch (item.getItemId()) {  
  4.     case R.id.action_overflow:  
  5.         if (mPopupMenu == null) {  
  6.             mPopupMenu = new PopupMenu(this,  
  7.                     findViewById(R.id.action_overflow));  
  8.             mPopupMenu.inflate(R.menu.popup_menu);  
  9.             mPopupMenu.setOnMenuItemClickListener(this);  
  10.         }  
  11.         mPopupMenu.show();  
  12.         return true;  
  13.     default:  
  14.         return super.onOptionsItemSelected(item);  
  15.     }  
  16. }  

自定義主題的不同

由於library會識別系統,OS3.0以上使用系統自帶的ActionBar,OS3.0以下使用library的ActionBar。所以主題都要準備兩套,一套系統用,一套library用。

比如:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <!-- ActionBar styles -->  
  2. <style name="AppTheme.MyActionBar" parent="@style/Widget.AppCompat.ActionBar.Solid">  
  3.     <item name="android:background">@drawable/common_title_bg</item>  
  4.     <item name="android:backgroundSplit">@drawable/common_title_bg</item>  
  5.     <item name="android:titleTextStyle">@style/AppTheme.MyActionBar.TitleTextStyle</item>  
  6.     <item name="android:actionOverflowButtonStyle">@style/AppTheme.MyActionBar.actionOverflowButtonStyle</item>  
  7.   
  8.     <!-- Support library compatibility -->  
  9.     <item name="background">@drawable/common_title_bg</item>  
  10.     <item name="backgroundSplit">@drawable/common_title_bg</item>  
  11.     <item name="titleTextStyle">@style/AppTheme.MyActionBar.TitleTextStyle</item>  
  12.     <item name="actionOverflowButtonStyle">@style/AppTheme.MyActionBar.actionOverflowButtonStyle</item>  
  13. </style>  

當在Android3.0以下版本的手機上運行的時候,會出現以下錯誤,但是此錯誤不影響程序運行。

Style contains key with bad entry: 0x01010300

此錯誤的原因是因爲準備了兩套自定義主題,給系統用的那套需要在3.0以上的版本運行,所以3.0以下的版本自然沒有這些屬性,所以就報錯了。

解決辦法是把給系統用的那套主題移到values-v14裏面去就行了。

出現java.lang.ClassNotFoundException異常

檢查Project -> Properties -> Java Build Path -> Order & Export -> Android Private Libraries 是否被勾中。

Order and Export有兩個屬性。調用優先級的問題,越在上邊調用優先級越高,例如,在同包同類名的情況下,將優先從上到下執行搜索調用;打勾與不打勾的區別在於導出jar包時是否將這個庫的內容也打包到jar中,勾爲包含,不勾爲不含。

一個使用android-support-v7-appcompat的Navigation Drawer的Demo:http://download.csdn.net/detail/tianjf0514/6462957

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章