1. 程式人生 > >Android 匯入v7包常見錯誤,以及專案引用v7包錯誤解決

Android 匯入v7包常見錯誤,以及專案引用v7包錯誤解決

        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庫工程中引入的支援包):

                                          

執行專案,大功告成