自定義組合控件

轉自http://www.cnblogs.com/hdjjun/archive/2011/10/12/2209467.html 代碼爲本身編寫html

目標:實現textview和ImageButton組合,能夠經過Xml設置自定義控件的屬性。 java

      經過代碼或者經過xml設置自定義控件的屬性android

1.控件佈局:以Linearlayout爲根佈局,一個TextView,一個ImageButton。 
  
Xml代碼
[html]  view plain copy print ?
  1. < ?xml version="1.0" encoding="utf-8"?>    
  2.     < LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"    
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"    
  4.     android:gravity="center_vertical">    
  5.     < TextView android:layout_height="wrap_content" android:id="@+id/text1"    
  6.     android:layout_width="wrap_content">< /TextView>    
  7.     < ImageButton android:layout_width="wrap_content"    
  8.     android:layout_height="wrap_content" android:id="@+id/btn1">< /ImageButton>    
  9.     < /LinearLayout>  
2.自定義控件代碼,從LinearLayout繼承: 
  
Java代碼
[java]  view plain copy print ?
  1. public class ImageBtnWithText extends LinearLayout {    
  2.      }    
  3.       public ImageBtnWithText(Context context) {    
  4.       this(context, null);    
  5.       }    
  6.          
  7.       public ImageBtnWithText(Context context, AttributeSet attrs) {    
  8.       super(context, attrs);    
  9.        //在構造函數中將Xml中定義的佈局解析出來。   
  10.       LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, thistrue);  
  11.         }    
  12.       }  

 
3.在主界面佈局xml中使用自定義控件: 
  
Xml代碼 
[html]  view plain copy print ?
  1. < com.demo.widget2.ImageBtnWithText    
  2.    android:id="@+id/widget"    
  3.    android:layout_width="fill_parent"    
  4.    android:layout_height="fill_parent" />  

即便用完整的自定義控件類路徑:com.demo.widget2.ImageBtnWithText定義一個元素。 
  運行能夠看到控件已經可以被加載到界面上。 
4.給按鈕設置圖片和文本 
  若是圖片是固定不變的,那麼直接在控件佈局中設置ImageButton的src屬性便可。 
  4.1經過Java代碼設置,在控件代碼中提供函數接口: 
  
Java代碼
[java]  view plain copy print ?
  1. public void setButtonImageResource(int resId) {    
  2.    mBtn.setImageResource(resId);    
  3.    }    
  4.       
  5.    public void setTextViewText(String text) {    
  6.    mTv.setText(text);    
  7.    }  

而後再在主界面的onCreate()經過函數調用設置便可。 
  4.2經過Xml設置屬性 
  4.2.1首先定義Xml能夠設置的屬性集合,在values下建立attrs.xml,文件名可隨意,通常都叫attrs.xml 
  
Xml代碼
[html]  view plain copy print ?
  1. < ?xml version="1.0" encoding="utf-8"?>    
  2.   < resources>    
  3.    < declare-styleable name="ImageBtnWithText">    
  4.    < attr name="android:text"/>    
  5.    < attr name="android:src"/>    
  6.    < /declare-styleable>    
  7.    < /resources>  

屬性集合名字:ImageBtnWithText,本身可根據實際來定義; 
  集合中包含的屬性列表,每行一個屬性。 
  4.2.2修改自定義控件實現代碼,以獲取xml中定義的屬性 
  
Java代碼
[java]  view plain copy print ?
  1. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageBtnWithText);    
  2.   CharSequence text = a.getText(R.styleable.ImageBtnWithText_android_text);    
  3.   if(text != null) mTv.setText(text);    
  4.   Drawable drawable = a.getDrawable(R.styleable.ImageBtnWithText_android_src);    
  5.   if(drawable != null) mBtn.setImageDrawable(drawable);    
  6.   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定義屬性名 
  
Xml代碼 
[html]  view plain copy print ?
  1. < attr name="appendText" format="string"/>  

和直接使用系統的attr不一樣的是要增長一個format屬性,說明此屬性是什麼格式的。format可選項可參見注1 
  4.3.2使用自定義屬性 
  
Xml代碼
[html]  view plain copy print ?
  1. < ?xml version="1.0" encoding="utf-8"?>    
  2.    < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.    xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"    
  4.    android:orientation="vertical" android:layout_width="fill_parent"    
  5.    android:layout_height="fill_parent">    
  6.    < com.demo.widget2.ImageBtnWithText    
  7.    android:text="ABC" android:src="@drawable/icon" android:id="@+id/widget"    
  8.    android:layout_width="fill_parent" android:layout_gravity="center"    
  9.    android:layout_height="fill_parent" myspace:appendText="123456">    
  10.    < /com.demo.widget2.ImageBtnWithText>    
  11.    < /LinearLayout>  
效果圖
 


相關文章
相關標籤/搜索