轉自http://www.cnblogs.com/hdjjun/archive/2011/10/12/2209467.html 代碼爲本身編寫html
目標:實現textview和ImageButton組合,能夠經過Xml設置自定義控件的屬性。 java
經過代碼或者經過xml設置自定義控件的屬性android
1.控件佈局:以Linearlayout爲根佈局,一個TextView,一個ImageButton。
Xml代碼
- < ?xml version="1.0" encoding="utf-8"?>
- < LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
- android:gravity="center_vertical">
- < TextView android:layout_height="wrap_content" android:id="@+id/text1"
- android:layout_width="wrap_content">< /TextView>
- < ImageButton android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:id="@+id/btn1">< /ImageButton>
- < /LinearLayout>
2.自定義控件代碼,從LinearLayout繼承:
- public class ImageBtnWithText extends LinearLayout {
- }
- public ImageBtnWithText(Context context) {
- this(context, null);
- }
-
- public ImageBtnWithText(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, this, true);
- }
- }
3.在主界面佈局xml中使用自定義控件:
- < com.demo.widget2.ImageBtnWithText
- android:id="@+id/widget"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
即便用完整的自定義控件類路徑:com.demo.widget2.ImageBtnWithText定義一個元素。
運行能夠看到控件已經可以被加載到界面上。
4.給按鈕設置圖片和文本
若是圖片是固定不變的,那麼直接在控件佈局中設置ImageButton的src屬性便可。
4.1經過Java代碼設置,在控件代碼中提供函數接口:
- public void setButtonImageResource(int resId) {
- mBtn.setImageResource(resId);
- }
-
- public void setTextViewText(String text) {
- mTv.setText(text);
- }
而後再在主界面的onCreate()經過函數調用設置便可。
4.2經過Xml設置屬性
4.2.1首先定義Xml能夠設置的屬性集合,在values下建立attrs.xml,文件名可隨意,通常都叫attrs.xml
- < ?xml version="1.0" encoding="utf-8"?>
- < resources>
- < declare-styleable name="ImageBtnWithText">
- < attr name="android:text"/>
- < attr name="android:src"/>
- < /declare-styleable>
- < /resources>
屬性集合名字:ImageBtnWithText,本身可根據實際來定義;
集合中包含的屬性列表,每行一個屬性。
4.2.2修改自定義控件實現代碼,以獲取xml中定義的屬性
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageBtnWithText);
- CharSequence text = a.getText(R.styleable.ImageBtnWithText_android_text);
- if(text != null) mTv.setText(text);
- Drawable drawable = a.getDrawable(R.styleable.ImageBtnWithText_android_src);
- if(drawable != null) mBtn.setImageDrawable(drawable);
- a.recycle();
首先經過context.obtainStyledAttributes得到全部屬性數組;
而後經過TypedArray類的getXXXX()系列接口得到相應的值。
4.2.3在主界面佈局中設置自定義控件的屬
android:text="ABC" android:src="@drawable/icon
4.3自定義名稱屬性:
在4.2中使用的屬性名是Android系統命名空間的,都以android開頭,好比android:text等。
實際開發中會自定義一些屬性名,這些屬性名仍然定義在4.2.1提到的attrs.xml中:
4.3.1定義屬性名
- < attr name="appendText" format="string"/>
和直接使用系統的attr不一樣的是要增長一個format屬性,說明此屬性是什麼格式的。format可選項可參見注1
4.3.2使用自定義屬性
- < ?xml version="1.0" encoding="utf-8"?>
- < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- < com.demo.widget2.ImageBtnWithText
- android:text="ABC" android:src="@drawable/icon" android:id="@+id/widget"
- android:layout_width="fill_parent" android:layout_gravity="center"
- android:layout_height="fill_parent" myspace:appendText="123456">
- < /com.demo.widget2.ImageBtnWithText>
- < /LinearLayout>
效果圖