Android自定義View研究(四) — 在XML中定義View – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

如果在一直使用SetContentView(new HellwView(this)感覺總是少瞭一點東西,少瞭什麼瞭,失去瞭Android中使用XML定義組件的方便性性,這種感覺讓人很不爽,呵呵,在這節裡我們會看到一個自定義View報錯的解決方法,讓我們來看看在XML中定義View吧

 

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

 

我們試著直接將錯誤的那個例子寫出來

將上一講的View例子拿出來,修改main佈局:

<?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"

    />

    <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)這個構造器,結局方法呼之欲出瞭,呵呵。

 

二、解決方法

隻需要在HelloView 中添加以下方法就解決瞭:

    /**

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

     **/

    publicHelloView(Context context,AttributeSet attrs){

       super(context, attrs);

}

 

運行:

 

       

 

關於這個解決方法網上有類似的問題:為什麼非得加上這個方法,其實這個方法是作為系統解析XML中定義的屬性時作為回調方法用的。如果想更深入的瞭解View以及剛才的解決方案的原理的話,可以關註我的博客,我會在以後的《深入解析View原理》中講解,呵呵,說不定有時候會有一種豁然開朗的感覺。

 

三、另一中在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>

運行結果與上面一樣

 

             

 

http://up.aiwalls.com/2011/1129/20111129035329837.rar
http://up.aiwalls.com/2011/1129/20111129035329164.rar
http://up.aiwalls.com/2011/1129/20111129035329207.rar

 

          

作者 繁星皓月

發佈留言