編輯:關於Android編程
我們知道,android自第一代發布以來,它的版本更新迭代的速度可以說是非常快的,但是android又是一個移動操作系統,是面對所有的用戶的,並不是一個行業專用的系統,這就是要求這個系統在頻繁的更新中,必須使得已經存在運行的大規模的系統能夠被新的版本兼容。要做到這一點主要就是要做好API的兼容問題,老的接口被廢棄了,但是在新的系統版本上必須還能使用;新的接口老版本上沒有,但是提供了極好的特性,開發者想在老的系統平台上使用;這些問題都是android發展中的問題,那麼這些問題怎麼解決呢?Google引入了Support Library這個玩意兒。本文就本人的開發經驗來聊一聊Support Library,旨在向新手介紹一下這個東西。本文寫作的時候,借鑒了google官方關於Support Library的介紹,並且加入了一些自己的理解,若有偏差,在所難免,希望大家即使指正。
Google Support Library的介紹地址:
https://developer.android.com/topic/libraries/support-library/index.html
另外,如果你下載了android的sdk之後Support Library的jar和源碼存放的路徑是:
/extras/android/support/
內容大概像這樣:
Android Support Library提供了很多沒有編譯進framework的特性,這些庫提供了很多向後兼容的新特性,提供了在framework中沒有的很有用的UI元素,還提供了很多app可以使用的工具。在很多情況下,一些特性對有很多app的開發者而言是很有價值的,但是這些特性如果包含在framework中就不是很合適。比如說,某個app可能需要一個針對某個特定的使用場景下的特性,並不是一個通用的場景特性,這個時候如果把它放到framework中去的話,就會使得framework變得越來越臃腫,並且可能導致API混亂,這些對於一個操作系統來說都是致命的。
但是這些需求,android不能不管不問,所以android提供了一系列的支持包來支持這些需求,這些支持包的呈現形式是一個jar包,app開發者只要把這個jar包添加到app工程中去就可以使用其中的特性和API了。Support Library提供了以下基本特性:
1. 版本向後兼容:保證新版的特性在老版本上依然可以運行
2. 實現了android布局模式的UI元素
3. 支持不同形式的元素
4. 多種多樣的工具方法函數
Android Support Library提供了這麼多的特性,所以google建議所有的app開發者應該使用Support Library進行開發。下面我們逐個梳理下這些特性:
Support Library允許app在老舊的android版本上使用新的android版本上才能使用的特性。舉個例子來說,假如你開發了一個app,這個app使用了android 5.0的材料設計,整個app的界面風格都是材料設計的風格,看起來很漂亮!這個app在5.0,6.0上運行一點問題都沒有,但是一旦到4.4之前的系統上運行的話,所有的材料設計風格全部沒有了,而且看來很丑。。。。。怎麼辦?根本的原因就是4.4之前的版本就不支持材料設計這個玩意兒!!!但是Support Library的appcompat library就可以解決,只要你的app包含了這個庫,並且聲明使用他裡面的材料設計主題就可以在很老的android版本上使用材料設計了!是不是很簡單,是的!之所以簡單的原因是google把復雜的事情替你做完了,你只要使用就可以了。這樣一來,你的app就可以在很多的android版本中保持用戶體驗的一致性了!
在某些情況下,Support Library的行為還是會受制於具體android平台的,因為它最終還是需要使用系統的接口的。這些情況下,如果一個app調用了Support Library的一個方法,那麼這個方法的行為就會取決於app運行的平台版本。如果framework提供了此方法必要的方法,那麼Support Library就會調用這個方法來完成工作;如果app是運行在老舊的版本上的話,並且framework沒有提供必要的接口的話,那麼Support Library就會嘗試調用自己內部的接口來完成這個工作或者最糟糕的就是壓根調用就沒有反應。但是絕對不會導致app崩潰或者出現很奇怪的BUG!這個時候Support Library表現的出來的行為就是不可預期的,保證最差的結果就是沒有結果,絕對不會給出一個錯誤的結果。同時app不應該自己去判斷系統平台的版本,這個工作應該由Support Library自己來完成,凡是類名以Compat結尾的都會自動做這樣的判斷,比如ActivityCompat這個類。這部分接口在使用的時候,需要仔細查看相關的api文檔說明。
另外,比較重要的就是,Support Library也會提供一些完整的,完全獨立的接口類,這些類和系統平台的framework沒有任何關系,在任何平台上的表現都是一樣的。這部分的接口可以放心地使用!
再次說明一下,在以上兩種情況下app都不應該主動去檢查系統平台的版本,這部分的工作應該由Support Library內部完成的。
Support Library提供了不被android framework影響的UI元素,舉個例子來說,android Support Library提供了一個額外的布局類:DrawerLayout。這些類的設計遵循了android系統設計的基本實踐原則,比如Design Library遵循了android 5.0的材料設計全部原則,這樣的話這個庫在很多android版本上的運行表現都是一樣的。
如果你使用support library的話,你就可以避免陷入重復造車輪的困境。如果你的app有一個特定的UI需求,你就可以使用這些現成的代碼,這些庫提供了用戶一直熟悉的界面風格和設計,這對於保證app的用戶體驗一致性是非常重要的。這些類還可以幫助你構建出一個看起來很像android生態環境中的一部分的app,因為這些庫的設計是完全android的設計哲學的!舉一個例子,許多的app都需要展示一個任意長度的列表,並且需要當信息發生變化的時候,這個列表中的信息能夠快速,流暢地展示出來;這個列表中的元素可能是郵件,聯系人,音樂專輯等等。這些app可以使用support library中的RecyclerView來顯示列表。這種做法可以使得開發者不用從0開始構建自己需要的類,並且能夠很好保證用戶在我們的app中的體驗和系統平台的體驗是一致的!這些都是HMI設計中重要的原則!
Android SDK提供了很多要素的類庫,比如TV和可穿戴設備,一個app可以依賴一個合適的support library去提供多平台統一的功能,並且可以提供存在於外部顯示器,揚聲器和其他地方的設備的內容。
Android support library還提供了很多向後兼容的多平台,多版本的工具類方法。app可以使用這些工具類來提供一個在多個多個android系統版本之間的一致的用戶體驗。比如說,support library提供的權限方法,這個方法的運行會依賴於具體的系統版本,假如運行在支持動態運行時權限檢查模型的版本(6.0+)的話,那麼這個方法會在運行是彈出相應的對話想用戶請求需要的權限;如果是運行在不支持動態權限的版本上時,這個方法會在app安裝時候保證所需要的權限被授予。
Android Support Library包包含了一系列可以包含在你的app中的庫,這些庫中的每一個庫都提供了特定的android版本范圍支持和特性集合。
接下來我們分別講述這些庫的特性,以幫助你決定使用哪些支持庫。通常來講google建議開發者需要包含v4 support 和 v7 appcompat這兩個庫,因為這兩個庫提供了很大范圍的android版本支持和符合android UI設計模式的API。
這個庫之所以叫V4支持庫的原因就是它是運行再android 1.6(API 4)版本之上的,和其他的庫相比它提供了極豐富的API,包括對於app組件的支持,用戶界面特性,設備無障礙使用,數據處理,網絡鏈接和編程工具等。這裡我們簡單說明一下這個庫中包含的類:
Fragment提供了靈活的界面設計,尤其是針對界面變化頻繁或者屏幕較大(如平板設備)的情況下的UI設計。需要注意的是,如果你使用了V4包中的Fragment的話,那麼就算你的app運行在android 3.0之上的系統,你的app依然使用的是V4包中的Fragment類,而不是系統framework中的Fragment。 NotificationCompat 添加針對富信息內容的通知特性,android中的notification分為普通通知和富文本通知,普通通知大概像這個樣子:
這部分針對特殊人士設計,比如聾啞等人士。
1. ExploreByTouchHelper
2. AccessibilityEventCompat
3. AccessibilityNodeInfoCompat
4. AccessibilityNodeProviderCompat
5. AccessibilityDelegateCompat
com.android.support:support-v4:23.3.0
這是一個針對Dalvik虛擬機的支持庫,當一個app使用了超過65535個方法的時候就需要使用multidex配置,這個庫就是添加這個配置支持的。關於multidex的更多消息,請查看:
https://developer.android.com/studio/build/multidex.html
不過目前的主要app都不會使用這麼多的方法,因此這個庫使用比較少。
這個庫是運行再android 2.1(API 7)之上版本的系統上,這個庫包含了一系列的子庫,這些子庫可以互相獨立地存在和應用在app中。
這是V7庫的app兼容庫,這個庫添加了對Action Bar UI設計模式的支持,添加了針對材料設計的UI設計實現支持。如果你的app想要在android 5.0之下的版本中運行並且想要材料設計的界面風格,就必須包含這個庫。需要注意的是,這個庫會依賴V4的庫。
這裡我們列出幾個V7庫中的關鍵類:
1. ActionBar 這個是ActionBar實現的類,ActionBar是app開發中比較常用的界面元素,它大概長成這個樣子:
圖中的第2部分就是ActionBar用於點擊下拉選擇執行的操作。更多關於ActionBar的信息請查看:
https://developer.android.com/design/patterns/actionbar.html
2. AppCompatActivity 這是為了在低版本(API 7+)上實現ActionBar的一個activity,也就是說如果你的app想要在API 7以上的android版本中實現ActionBar你必須使你的Activity類集成自AppCompatActivity這個類,而不是Activity類。
3. AppCompatDialog 提供基於AppCompat主題的dialog實現
4. ShareActionProvider 添加共享信息行為的action bar支持,共享action bar像下面這樣:
用戶可以選擇共享數據的形式,代碼上也很簡單,只要在你的menu的xml文件中加上app:actionProviderClass就行:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
在gradle中使用V7 appcompat支持包也很容易:
com.android.support:appcompat-v7:23.3.0
這個庫主要添加了CardView的支持,CardView是一個繼承自FrameLayout的widget,主要用於實現材料設計風格的帶有圓角和陰影效果的卡片式UI效果,如下圖:
更多的CardView信息請看:
https://developer.android.com/training/material/lists-cards.html
在gradle中添加該庫:
com.android.support:cardview-v7:23.3.0
該庫添加了grid布局的支持,grid布局是一個網格式的布局,方面在一個屏幕上顯示多個格局相似的信息,網格布局大致如下:
另外我們home桌面程序launcher的布局也是一個網格布局,用於顯示所有app的icon和名稱。
在gradle中添加該庫:
com.android.support:gridlayout-v7:23.3.0
這個庫是一個多媒體路由的庫,主要提供了MediaRouter, MediaRouteProvider等類,還有就是支持Google Cast的類,Google Cast是google在2013年7月25日發布的全新的鏈接設備,主要運行簡化版本的chrome操作系統,可以插在電視機的HDMI接口上。關於Google Cast的詳細信息,請查看google cast官方站點:
https://developers.google.com/cast/
這個庫中的類主要就是提供將本地媒體流路由到一個外部的屏幕,音頻播放器和其他的目標設備,該庫中提供了發布特定app的媒體路由提供器,以便查找和選擇合適的目標設備。關於本庫更加詳細的信息請查看api手冊:
https://developer.android.com/reference/android/support/v7/media/package-summary.html
在gradle中添加該庫:
com.android.support:mediarouter-v7:23.3.0
該庫主要提供了調色板的功能,這個庫可以用來從一個圖片中抽取某個顏色。舉個例子,一個音樂app可能會從當前播放的音樂的的封面圖片中抽取出圖片的主題顏色,然後使用這個顏色裝飾一下當前界面的主題顏色,這樣就使得界面更加柔和,給用戶更多的代入感。這個庫中的一個主要的類就是 Palette 類,這個類的api:
https://developer.android.com/reference/android/support/v7/graphics/Palette.html
在gradle中使用這個庫:
com.android.support:palette-v7:23.3.0
該庫主要是提供RecyclerView這個控件,用來再一個有限的窗口中高效靈活地展示數據項,關於RecyclerView 的使用大家可以參考這個博客:
http://blog.csdn.net/lmj623565791/article/details/45059587
在gradle中使用該庫:
com.android.support:recyclerview-v7:23.3.0
這個庫主要就是添加了preference的支持,包括CheckBoxPreference 和 ListPreference等類。
在gradle中使用這個庫:
com.android.support:preference-v7:23.3.0
這是V8版本的支持庫,主要運行在android 2.2(API 8)以上的版本中。
這個子庫提供了renderscript的支持,renderscript是一個android平台上的類C腳本語言,主要實現圖形的渲染功能。關於renderscript請查看google的說明:
https://developer.android.com/guide/topics/renderscript/compute.html
還可以查看這個博客:
http://www.cnblogs.com/TerryBlog/archive/2012/03/02/2377251.html
在gradle中使用該庫:
defaultConfig {
renderscriptTargetApi 18
renderscriptSupportModeEnabled true
}
這是V13版本的支持庫,這個庫的運行目標是android3.2(API 13)以上的版本,主要是添加了Fragment用戶界面模式的支持。更多信息查看android文檔:
https://developer.android.com/reference/android/support/v13/app/package-summary.html
在gradle中使用該庫:
com.android.support:support-v13:23.3.0
添加了更加豐富的Preference的支持,api文檔:
https://developer.android.com/reference/android/support/v14/preference/package-summary.html
在gradle中使用該庫:
com.android.support:preference-leanback-v17:23.3.0
添加在TV大屏幕設備上的API類,包含了很多在TV上使用的控件。
在gadle中使用該庫:
com.android.support:leanback-v17:23.3.0
添加JAVA注解支持,以便更加有效地實施軟件設計。關於JAVA注解請看這個博客:
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
android的注解支持庫使用可以看看android工具組的文檔,簡單明了:
http://tools.android.com/tech-docs/support-annotations
在gradle中使用該庫:
com.android.support:support-annotations:23.3.0
這個庫主要添加了材料設計的支持,包含了很多材料設計的組件和模式。關於這個庫的使用可以看下這篇老外寫的博客,寫的很清楚:
https://www.sitepoint.com/material-design-android-design-support-library/
當然,如果大家對E文表是無力的話,也可以看看國人寫的博客:
http://blog.csdn.net/eclipsexys/article/details/46349721
個人建議先看看那個老外的文章,然後在看國人的文章,結合來看最好。
這個庫使得app開發者可以方便地添加和管理app中的自定義tab,關於custom tabs的介紹請看chrome官網的介紹:
https://developer.chrome.com/multidevice/android/customtabs
這個直接參考google的文檔,有圖有真相,很清楚:
https://developer.android.com/topic/libraries/support-library/setup.html
支持庫隨著android一起在成長,也在不停地進步發展,如果你對支持庫的版本迭代歷史感興趣的話可以查看:
https://developer.android.com/topic/libraries/support-library/revisions.html
1. 從相冊選擇照片進行裁剪 從相冊選擇照片並裁剪: /** * 從相冊選擇照片進行裁剪 */ private void
使用ViewStub延遲加載1.ViewStub延遲加載 ViewStub是一個不可見的,大小為0的View,最佳用途就是實現View的延遲加載,在需要的時候再加載Vie
簡述Qt Network 模塊中提供了一些高級別的類,例如:QNetworkRequest、QNetworkReply 和 QNetworkAccessManager,使
沉浸式狀態欄的來源就是很多手機用的是實體按鍵,沒有虛擬鍵,於是開了沉浸模式就只有狀態欄消失了。於是沉浸模式成了沉浸式狀態欄。我們先來看下具體的效果開啟沉浸模式後,狀態欄消