android下v4 v7 v21等包是android系統的擴展支持包,就想windows的系統補丁一個道理。
android的擴展包主要是用來兼容低版本的,比如android3.0以后出現了actionbar,如果要使用actionbar,那么手機系統必須在3.0以上才能使用,這樣將會導致很多用戶不能安裝apk從而損失用戶;(有人會想,為什么不直接將新出來的東西全部打包到sdk中而是提供各種支持包?我是這樣理解的,比如:如果將原生actionbar直接打包到低版本的sdk包中,而低版本手機里面卻沒有相關的代碼,這樣即使在開發的時候能在兼容低版本,但運行在低版本手機上時,應用去系統中找actionbar,發現沒有就會報錯,所以這種做法是不能實現的)
google開發人員將高版本出來的新東西做了很多向下兼容的支持包,這就是v4、v7...等包的作用,實現的原理就是模仿高版本的新內容,使用低版本去實現(比如v7包中actionbar,其實就是自定義了一個title欄,然后上面有title、logo、back鍵等等,給這些控件賦值或者設置屬性都是模仿原生actionbar的屬性名稱,具體請關注我下一篇博客---使用actionbarsherlock替換原生actionbar)
然而,當我使用v7包的時候卻不是那么順暢,在這里總結一下使用的步驟、遇到的錯誤以及解決的辦法:
1、導入v7包:
Eclipse——>Import--->Existing Android Code Into Workspase--->
D:\IDE\ANDROID64\sdk\extras\android\support\v7\appcompat;(導入成功后,在工作空間里就會有這樣一個項目,打開看看里面的內容,發現src目錄下是空的,為什么沒有代碼呢?原來v7包將java源代碼打成了jar包
,在項目libs目錄下;整個工程的結構就是引用了v7-appcompat.jar,然后一個res目錄;其實這個res目錄才是重點,如果沒有res目錄,v7包的使用就不會這么麻煩,直接將v7-appcompat.jar拷貝到項目中就行了,但是這個jar包中是沒有資源目錄的,這就是為什么v7支持包需要一庫工程的形式供開發者使用。)
2、接下來會發現v7工程報了錯誤:
res目錄下有很多values目錄,這是android為了兼容和適配不同版本系統而細分了很多個values目錄,
values-v21就是Android5.0系統加載的資源目錄(根據values后面的后綴,可區分不同版本、不同分辨率、不同語言等從而兼容不同版本、適配不同屏幕大小和不同國家語言),有人會嘗試把這些“多余”的values包刪除掉,就不報錯了,但是發現刪除這個后又有了新的錯誤,永無止境,況且即使你把所有的錯誤都刪除,估計這個v7包也沒什么用了,所以這種解決辦法是不可行的。
剛剛上面說到了values-v21是Android5.0加載資源的目錄,但是我發現我的編譯版本是4.0,這就是為什么報錯,因為編譯版本是4.0,在應用編譯打安裝包時,她不認為這個應用會安裝到5.0上,因為target是4.0,所以它不會為5.0做任何事情,也就更不會將values-21打包進去,既然不會打包進去,存在就沒什么價值,所以認為Android4.0應用中不應該存在這個values-21,所以就報錯了;解決辦法就是講編譯版本提高到5.0以上:
解決辦法:只要將編譯版本提高到5.0就行
(右擊-->Properties--->Project Build Target--->勾選5.0———>clean庫工程)
3、我們的工程應用庫工程后,還是報錯,同樣的道理,因為我們的工程將v7庫工程引用進來后,我么你的資源目錄里面就包括了v7的資源目錄,里面照樣也會有values-v21等,我已也要將我們的工程編譯版本提高到5.0,然后clean
4、完成上述操作后,發現工程沒有錯誤了,但是一運行,又報錯:
它說在support-v7包的ActionBar中有多個dex文件,但遇到這種錯誤,一般都是重復引入jar包造成的;
再看看工程的build path:
果然發現引入了兩個v4和v7包,這是為什么?
原來在我們自己的工程libs下有一個v4包和一個v7包,而v7庫工程里面也有,我的工程又引用了v7庫工程,
這樣將v7庫工程下的v4和v7包也引入了,所以導致工程中重復了:
找到了原因,問題就迎刃而解了,打開工程的build path,Remove掉我們工程中的兩個支持包就行
(使用v7庫工程中引入的支持包):
運行項目,大功告成