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 version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res/com.ql.app"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- <com.ql.app.Meter
- android:id="@+id/meter"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- app:max="100"
- app:incr="5"
- app:decr="5"
- />
- </LinearLayout>
相关推荐
pigsmall 2020-11-19
SXIAOYI 2020-09-16
Ladyseven 2020-07-25
whileinsist 2020-06-24
gufudhn 2020-06-12
冰蝶 2020-06-05
LinuxAndroidAI 2020-06-04
supperme 2020-05-28
yaodilu 2020-05-10
e度空间 2020-04-27
云端漂移 2020-04-09
peterwzc 2020-03-17
有心就有方向 2012-09-03
ebuild 2013-05-14
donghedonghe 2013-05-31
tdeclipse 2011-02-28
linuxprobe0 2013-04-15
linuxprobe0 2013-04-01