在Android源碼中擴展自定義View的方法


作者: yuanquan.xu


筆者在開發應用中,有時需要實現自定義滾動的控件,Android提供的NumberPicker可以滿足基本功能,但實際上擴展起來,各種不方便。比如,顯示行數固定爲3行且無法更改,很多變量和attr是私有類型或者系統隱藏類型,無法直接在xml中定義,等等等等。因此,針對目前項目中在Eclipse進行開發,通過源碼編譯進行系統集成的情況,本文主要提出了一種通過源碼編譯庫,實現對系統Widget擴展的方法。

在系統Widget裏,有很多屬性和方法是hide的,使用eclipse會因爲找不到這些屬性而編譯失敗。如果使用Eclipse來擴展,比較快的方法是刪除或替換這些方法,但這些可能造成某些功能的缺失或其他不穩定因素。而使用源碼編譯成jar,可以儘可能地保留這些代碼並實現擴展接口。實現在app中自定義而不需要對framework進行修改。

         以自定義NumberPicker爲例,擴展一個View主要有以下的步驟:

1、   在Eclipse新建一個空的Android項目,保留AndroidManifest.xml,刪除src目錄。

2、   從framework找到NumberPicker.java和Scroll.java,修改包名並複製到項目中的java目錄下。用java替換掉src的原因,是可以方便地進行編輯,但不會被eclipse編譯,雖然強編也編不過。

3、   從framework找到和NumberPicker相關的drawable和attr,複製到項目的res相應目錄下。

4、   修改Android.mk,對代碼做相應的調整,編譯模塊。以下是Android.mk的關鍵修改:

LOCAL_RESOURCE_DIR:= $(LOCAL_PATH)/res               --添加資源文件,

LOCAL_MODULE :=com.android.widget.tpv                --定義模塊名,編譯成功後需要通過這個名字找到相應的jar

LOCAL_SRC_FILES :=$(call all-java-files-under, java)         --對java目錄下的java文件進行掃描,生成class

include$(BUILD_STATIC_JAVA_LIBRARY)                  --聲明生成jar庫,在eclipse通過導入jar實現引用

5、   在源碼下調試,編譯,然後根據提示,找到相應的jar,放到項目的libs,使得Eclipse可以通過源碼編譯生成的jar

6、   修改Eclipse的庫工程的屬性,在Eclipse->Project->Properties->Android->勾選Is Library,並在主工程包含它,使得通過Eclipse可以編譯依賴庫的資源的jar

7、   修改主工程的Android.mk,添加依賴庫的引用。調試,編譯。

 

總結:本文介紹了一種在不修改Framework,通過Android源碼編譯,實現在Eclipse擴展Widget的方法。通過這種方法,在犧牲系統升級的情況下, 以最小的修改來實現對Widget的定製和擴展。

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