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的自定義組件。

步驟

描述

1

使用Eclipse IDE創建一個Android應用程序項目,並將它命名爲:DateViewDemounder3

2

創建一個 res/values/attrs.xml 文件來定義數據類型以及新屬性

3

創建src/DateView.java文件,並添加定義自定義組件的代碼。這將擴展TextView,以有更多的功能來顯示當前的日期。提供的屬性具有解析邏輯AttributeSet作爲構造函數的參數

4

修改 res/layout/activity_main.xml  文件,並添加代碼以及一些默認的屬性和新屬性用於創建DateView實例

5

運行該應用程序啓動 Android模擬器並驗證應用程序所做的修改結果

下面是修改後的主活動文件 src/com.yiibai.dateviewdemo/MainActivity.java 的內容。該文件可以包含每一個生命週期的基本方法。

package com.example.dateviewdemo; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the // action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }

下面是 res/values/attrs.xml 文件的內容:

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

以下將是新的文件 src/com.yiibai.dateviewdemo/DateView.java 的內容,有的附加功能以顯示當前日期:

package com.example.dateviewdemo; import java.text.SimpleDateFormat; import java.util.Calendar; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.util.AttributeSet; import android.util.Log; import android.widget.TextView; public class DateView extends TextView { public String delimiter; public boolean fancyText; public DateView(Context context) { super(context); setDate(); } public DateView(Context context, AttributeSet attrs) { super(context, attrs); 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: delimiter = a.getString(attr); setDate(); break; case R.styleable.DateView_fancyText: fancyText = a.getBoolean(attr, false); fancyText(); break; } } a.recycle(); } public DateView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setDate(); } private void setDate() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy" + delimiter + "MM" + delimiter + "dd"); String today = dateFormat.format(Calendar.getInstance().getTime()); setText(today); // self = DateView = subclass of TextView } private void fancyText() { if( this.fancyText){ setShadowLayer(9, 1, 1, Color.rgb(44, 44, 40)); } } }

下面是 res/layout/activity_main.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" />

以下將是 res/values/strings.xml  中定義兩個新常量的內容:

<string name="app_name">DateViewDemo <string name="action_settings">Settings <string name="hello_world">Hello world!

以下是AndroidManifest.xml 默認的內容: 

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yiibai.guidemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.yiibai.guidemo.MainActivity" android:label="@string/app_name" > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />

讓我們試着運行DateViewDemounder3 應用程序。安裝程序在AVD並啓動它,如果一切設置和應用程序都沒有問題,它會顯示以下仿真器窗口:

Android自定義組件及屬性

以上代碼下載地址:http://pan.baidu.com/s/1hqy3P7e