Android中自定義View的研究(四) -- 在XML中定義View

       若是在一直使用 SetContentView(new HellwView(this) 噶虐老是少了一點東西,少了什麼了,失去了 Android 中使用 XML 定義組件的便攜性,這種感受讓人很不爽,呵呵,在這節裏咱們會看到一個自定義 View 報錯的解決方法,讓咱們來看看在 XML 中定義 View
 

1、XML中定義View的一個小錯誤 java

 
咱們試着直接將錯誤的那個例子寫出來
將上一講的 View 例子拿出來,修改 main 佈局:

<?xml version="1.0" encoding="utf-8"?> android

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 佈局

    android:orientation="vertical" this

    android:layout_width="fill_parent" spa

    android:layout_height="fill_parent" xml

    > utf-8

<TextView  博客

    android:layout_width="fill_parent" string

    android:layout_height="wrap_content" it

    android:text="@string/hello"

    />

    <com.fxhy.stady.HelloView

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    />

</ LinearLayout >
 
 
修改 MainActivity

super.onCreate(savedInstanceState);

         setContentView(R.layout. main ); //  使用自定義的 View
運行:




 
        咱們發現,居然報錯了,咱們在 LogCat 裏查看下:
 
11-24 10:58:38.993: ERROR/AndroidRuntime(323): Caused by: java.lang.NoSuchMethodException:HelloView(Context,AttributeSet)
 
居然是沒有 HelloView(Context,AttributeSet) 這個構造器,結局方法呼之欲出了,呵呵。
 

2、解決方法

只須要在 HelloView  中添加如下方法就解決了:

    /**

     * 這個是咱們要在XML中初始化用的

     * */

    public HelloView(Context context,AttributeSet attrs){

       super(context, attrs);

}
 
運行:
 

 
關於這個解決方法網上有相似的問題:爲何非得加上這個方法, 其實這個方法是做爲系統解析 XML 中定義的屬性時做爲回調方法用的 。若是想更深刻的瞭解 View 以及剛纔的解決方案的原理的話,能夠關注個人博客,我會在之後的 《深刻解析 View 原理》 中講解,呵呵,說不定有時候會有一種豁然開朗的感受。
 

3、另外一中在XML中的View佈局

咱們也可使用以下的方法在 XML 中添加 View

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

    />

    <view class="com.fxhy.stady.HelloView"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    />

</ LinearLayout >
運行結果與上面同樣

  
相關文章
相關標籤/搜索