簡介
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了。
- Found 2 versions of android-support-v4.jar in the dependency list,
- but not all the versions are identical (check is based on SHA-1 only at this time).
- All versions of the libraries must be the same at this time.
- Versions found are:
- Path: D:\Program Files\adt-bundle-windows-x86_64-20130917\eclipse\workspace\android-support-v7-appcompat\libs\android-support-v4.jar
- <pre code_snippet_id="113243" snippet_file_name="blog_20131215_1_6735911" name="code" class="plain"> Length: 556198
- SHA-1: 4a6be13368bb64c5a0b0460632d228a1a915f58f
- Path: D:\Program Files\adt-bundle-windows-x86_64-20130917\eclipse\workspace\NavigationDrawerDemo(android-support-v7-appcompat)\libs\android-support-v4.jar
- Length: 535319
- SHA-1: 3e1409c5f5c4cdf9fd41db4b22a3eec5b3b10d96
- Jar mismatch! Fix your dependencies</pre>
- <pre></pre>
- <p></p>
- <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文件的寫法的不同
- <menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
- <item android:id="@+id/action_search"
- android:icon="@drawable/ic_action_search"
- android:title="@string/action_search"
- yourapp:showAsAction="ifRoom" />
- ...
- </menu>
這是告訴系統,showAsAction使用library的XML attributes。
此外還有
yourapp:actionViewClass="android.support.v7.widget.SearchView"
yourapp:actionProviderClass="android.support.v7.widget.ShareActionProvider"
Up Navigation使用的不同
- <manifest ...>
- <activity uiOptions="splitActionBarWhenNarrow" ... >
- <meta-data android:name="android.support.UI_OPTIONS"
- android:value="splitActionBarWhenNarrow" />
- </activity>
- </manifest>
android:uiOptions="splitActionBarWhenNarrow"表示使用系統的Up Navigation。
meta-data部分表示使用library的Up Navigation。
自己實現PopupMenu
menu.xml
- <menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
- <item
- android:id="@+id/action_overflow"
- android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_light"
- android:title="@string/action_websearch"
- android:titleCondensed="@string/action_websearch"
- yourapp:showAsAction="ifRoom|withText"/>
- </menu>
popup_menu.xml
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <item
- android:icon="@drawable/action_search"
- android:title="@string/action_websearch"/>
- <item
- android:icon="@drawable/action_search"
- android:title="@string/action_websearch"/>
- </menu>
MainActivity.java
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.action_overflow:
- if (mPopupMenu == null) {
- mPopupMenu = new PopupMenu(this,
- findViewById(R.id.action_overflow));
- mPopupMenu.inflate(R.menu.popup_menu);
- mPopupMenu.setOnMenuItemClickListener(this);
- }
- mPopupMenu.show();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
自定義主題的不同
由於library會識別系統,OS3.0以上使用系統自帶的ActionBar,OS3.0以下使用library的ActionBar。所以主題都要準備兩套,一套系統用,一套library用。
比如:
- <!-- ActionBar styles -->
- <style name="AppTheme.MyActionBar" parent="@style/Widget.AppCompat.ActionBar.Solid">
- <item name="android:background">@drawable/common_title_bg</item>
- <item name="android:backgroundSplit">@drawable/common_title_bg</item>
- <item name="android:titleTextStyle">@style/AppTheme.MyActionBar.TitleTextStyle</item>
- <item name="android:actionOverflowButtonStyle">@style/AppTheme.MyActionBar.actionOverflowButtonStyle</item>
- <!-- Support library compatibility -->
- <item name="background">@drawable/common_title_bg</item>
- <item name="backgroundSplit">@drawable/common_title_bg</item>
- <item name="titleTextStyle">@style/AppTheme.MyActionBar.TitleTextStyle</item>
- <item name="actionOverflowButtonStyle">@style/AppTheme.MyActionBar.actionOverflowButtonStyle</item>
- </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