Android自定义组合控件

目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性。 
  1.控件布局:以Linearlayout为根布局,一个TextView,一个ImageButton。 
  

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);  
    }  
  }  


  在构造函数中将Xml中定义的布局解析出来。 
  3.在主界面布局xml中使用自定义控件: 
  

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 
  

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定义属性名 
  

import android.content.Context;  
import android.content.res.TypedArray;  
import android.util.AttributeSet;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.widget.ImageButton;  
import android.widget.LinearLayout;  
import android.widget.ProgressBar;  
  
public class Meter extends LinearLayout {  
    private int max=100;  
    private int incrAmount=1;  
    private int decrAmount=-1;  
    private ProgressBar bar=null;  
    public Meter(final Context ctxt, AttributeSet attrs) {  
        super(ctxt, attrs);  
          
        this.setOrientation(HORIZONTAL);  
          
        TypedArray a=ctxt.obtainStyledAttributes(attrs,R.styleable.Meter);  
          
        //获取里面属性用 "名字_ 属性" 连接起来  
        max=a.getInt(R.styleable.Meter_max, 100);  
        incrAmount=a.getInt(R.styleable.Meter_incr, 1);  
        decrAmount=-1*a.getInt(R.styleable.Meter_decr, 1);  
          
        a.recycle();  
    }  
    //当View中所有的子控件 均被映射成xml后触发  
    @Override  
    protected void onFinishInflate() {  
        super.onFinishInflate();  
          
//      ((Activity)getContext()).getLayoutInflater().inflate(R.layout.meter, this);  
          
        LayoutInflater.from(getContext()).inflate(R.layout.meter, this);  
          
        bar=(ProgressBar)findViewById(R.id.bar);  
        bar.setMax(max);  
          
        ImageButton btn=(ImageButton)findViewById(R.id.incr);  
        btn.setOnClickListener(new View.OnClickListener() {  
            public void onClick(View v) {  
                bar.incrementProgressBy(incrAmount);  
            }  
        });  
          
        btn=(ImageButton)findViewById(R.id.decr);  
        btn.setOnClickListener(new View.OnClickListener() {  
            public void onClick(View v) {  
                bar.incrementProgressBy(decrAmount);  
            }  
        });  
//      this.addView(view);//不需要add,默认已经add了  
    }  
}  


attrs.xml: 

@Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
    }  


main.xml: 

Xml代码  Android自定义组合控件
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:app="http://schemas.android.com/apk/res/com.ql.app"  
  4.     android:orientation="horizontal"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="wrap_content"  
  7.     >  
  8.     <com.ql.app.Meter  
  9.         android:id="@+id/meter"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content"  
  12.         app:max="100"  
  13.         app:incr="5"  
  14.         app:decr="5"  
  15.     />  
  16. </LinearLayout>  



Android自定义组合控件 

相关推荐