Android開發教學
Android 開發環境配置
Android 架構
Android 應用組件
Android Hello World示例
Android 資源組織和訪問
Android Activity
Android Service
Android廣播接收器
Android內容提供者
Android碎片/片段
Android Intent過濾器
Android UI佈局
Android LinearLayout
Android RelativeLayout
Android TableLayout
Android AbsoluteLayout
Android FrameLayout
Android ListView
Android GridView
Android UI控件
Android TextView
Android EditText
Android AutoCompleteTextView
Android Button
Android ImageButton
Android CheckBox
Android ToggleButton
Android RadioButton
Android RadioGroup
Android事件處理
Android樣式和主題
Android樣式示例
Android主題示例
Android自定義組件
Android拖放
Android通知
Android基於位置服務
Android發送電子郵件
Android發送短信/SMS
Android撥打電話
發佈Android應用
ArrayAdapter
SimpleCursorAdapter
Android ProgressDialog
Android Spinner
使用活動代碼自定義Android組件
使用佈局文件自定義Android組件
Android自定義組件及屬性
Android Alertdialog(警告對話框)
Android Animation(動畫)實例
Android音頻捕獲(錄音)
Android音頻管理器實例
Android AutoCompleteTextView(自動完成)實例
Android最佳實踐
Android Bluetooth(藍牙)實例
Android Camera(攝像頭)
Android Clipboard(複製/剪貼板)
Android自定義字體
Android數據備份
Android Gestures/手勢
Android圖片效果
Android圖片切換
Android內部存儲
Android JetPlayer實例
Android JSON解析器
Android加載Spinner
Android本地化
Android登錄實例
Android MediaPlayer(多媒體播放)

Android自定義組件

Android提供了一個預建的部件,如Button, TextView, EditText, ListView, CheckBox, RadioButton, Gallery, Spinner, AutoCompleteTextView等可以直接使用在Android應用程序開發中,但有可能還有一種情況,當不滿意現有可用的窗口小部件的功能。 Android 提供創建自定義組件功能,定製以滿足需求。 

如果只需要進行小的調現有的小工具或佈局,可以簡單的子類的小工具或佈局和覆蓋它的方法,這將精確地控制屏幕元素的外觀和功能。

本教程介紹瞭如何創建自定義視圖,並利用它們在應用程序,如下步驟。

創建一個簡單的自定義組件

最簡單的創建自定義的組件方法是擴展現有的widget類或子類,如果想擴展現有部件,如Button, TextView, EditText, ListView, CheckBox等,否則可以從android.view.View類開始擴展。 

在其最簡單的形式,編寫構造函數對應的所有基類的構造函數。例如,如果要擴展 TextView 創建DateView 以下三個構造,創建DateView類:

public class DateView extends TextView { public DateView(Context context) { super(context); //--- Additional custom code -- } public DateView(Context context, AttributeSet attrs) { super(context, attrs); //--- Additional custom code -- } public DateView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); //--- Additional custom code -- } }

TextView 的子類DateView已經創建,所以可以獲得有關TextView 的所有屬性、方法和事件,能夠使用不需要任何進一步的實現。這裏將實現額外的自定義功能在自己編寫的代碼,如下面的例子解釋。

如果要求執行自定義繪圖/定製部件的尺寸,那麼需要重寫 onMeasure(int widthMeasureSpec, int heightMeasureSpec) 和 onDraw(Canvas canvas) 方法。如果不打算調整或變更內置組件的形狀,那麼並不需要使用這些方法在自定義組件。 

佈局管理報告部件的寬度和高度需要協調 onMeasure() 方法,需要調用setMeasuredDimension(int width, int height),這種方法來報告尺寸大小。

可以執行自定義繪圖裏Canvas 的onDraw(Canvas canvas) 方法,其中android.graphis.Canvas其對應 Swing 是非常相似的,drawRect(), drawLine(), drawString(), drawBitmap() 等,可以用它來繪製組件。 

完成了一個自定義組件的實現之後,通過擴大現有的部件,將能夠實例化這些自定義組件在應用程序開發兩種方式:

Activity類實例內使用代碼

這是非常相似的方式實例化自定義組件實例的方式,在活動類的內置部件。例如,可以使用下面的代碼實例上面定義的自定義組件:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DateView dateView = new DateView(this); setContentView(dateView); }

查看這個例子來了解如何使用代碼裏面活動實例化一個基本的Android自定義組件。

使用佈局XML文件實例

使用傳統佈局XML文件實例的內置部件,相同的概念適用於自定義部件,因此將能夠實例化自定義組件佈局XML文件,解釋如下。在com.yiibai.dateviewdemo包,已經把所有的代碼相關DateView 和 DateView 類,已經把自定義組件的完整的邏輯的Java類名。 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <com.yiibai.dateviewdemo.DateView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#fff" android:textSize="40sp" android:background="#000" />

要注意,在這裏我們使用的所有 TextView 屬性以及自定義組件沒有任何變化。類似的方式能夠使用所有的事件、方法,以及DateView組件。

通過這個例子,瞭解如何使用佈局XML文件實例化一個基本的Android自定義組件。 

使用自定義屬性的自定義組件

我們已經看到可以如何擴展功能的內置部件,但上面給出兩個例子中看到,擴展組件,可以利用它的父類的所有默認屬性。但考慮到一種情況,當想從頭開始創建自己的屬性。下面是一個簡單的程序創建和使用Android的自定義組件的新屬性。這裏介紹三個屬性,並使用它們,如下所示:

<com.yiibai.dateviewdemo.DateView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#fff" android:textSize="40sp" custom:delimiter="-" custom:fancyText="true" />

第1步

第一步,使用自定義的屬性在 res/values/ 目錄下創建新XML文件中定義attrs.xml。看看一個例子文件 attrs.xml:

<declare-styleable name="DateView"> <attr name="delimiter" format="string"/> <attr name="fancyText" format="boolean"/>

這裏 name=value 就是要使用的佈局XML文件中並作爲屬性,format=type 屬性的類型。 

第2步

第二個步驟將是從佈局XML文件中讀取這些屬性,並將其設置爲組件。這個邏輯將獲得通過屬性集的構造函數,因爲這是包含XML屬性。要讀取XML中的值,首先需要從AttributeSet創建一個TypedArray,然後用它來讀取和設置值,如下面的示例代碼所示:

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DateView); final int N = a.getIndexCount(); for (int i = 0; i < N; ++i) { int attr = a.getIndex(i); switch (attr) { case R.styleable.DateView_delimiter: String delimiter = a.getString(attr); //...do something with delimiter... break; case R.styleable.DateView_fancyText: boolean fancyText = a.getBoolean(attr, false); //...do something with fancyText... break; } } a.recycle();

第3步

最後,可以使用佈局XML文件中定義的屬性如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res/com.yiibai.dateviewdemo" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <com.yiibai.dateviewdemo.DateView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#fff" android:textSize="40sp" custom:delimiter="-" custom:fancyText="true" />

重要的部分是xmlns:custom="http://schemas.android.com/apk/res/com.yiibai.dateviewdemo"。需要注意的是http://schemas.android.com/apk/res/將保持原樣,但最後一部分需要設置包名,也可以使用任何xmlns:在這個例子中,使用的是custom,但可以使用任何喜歡的名字。 

看看這個例子,以瞭解如何創建自定義屬性Android自定義組件 的簡單步驟。