一、问题
需要通过组合现有的元素来创建自定义的小部件。
二、解决方案
通过扩展通用的ViewGroup并添加所需的功能就能创建自定义的小部件。创建自定义小部件或可重用用户界面元素的最简单、实用的方法就是利用Android SDK提供的现有小部件来创建组合控件。
三、实现机制
ViewGroup及子类LinearLayout、RelativeLayout等能帮助摆放控件的位置,这样可以专注于添加所需的功能。
四、实用案例
含有图片或文字的按钮
public class TextImageButton extends FrameLayout{
private ImageView iv;
private TextView tv;
public TextImageButton(Context context){
this(context,null);
}
public TextImageButton(Context context,AttributeSet attrs){
this(context,attrs,0);
}
public TextImageButton(Context context,AttributeSet attrs,int defaultStyle){
//通过系统的按钮样式初始化父布局
//这样会设置clickable属性和按钮背景来匹配当前的主题
super(context,attrs,android.R.attr.buttonStyle);
iv=new ImageView(context,attrs,defaultStyle);
tv=new TextView(context,attrs,defaultStyle);
FrameLayout.LayoutParams params=new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTEXT,LayoutParams.WRAP_CONTEXT,Gravity.CENTER);
this.addView(iv,params);
this.addView(tv,params);
//如有图片,切换到图片模式
if(iv.getDrawable()!=null){
tv.setVisibility(View.GONE);
iv.setVisibility(View.VISIBLE);
}else{
tv.setVisibility(View.VISIBLE);
iv.setVisibility(View.GONE);
}
}
public void setText(CharSequence text){
tv.setVisibility(View.VISIBLE);
iv.setVisiblity(View.GONE);
tv.setText(text);
}
public void setImageResource(int resId){
tv.setVisibility(View.GONE);
iv.setVisibility(View.VISIBLE);
iv.setImageResource(resId);
}
public void setImageDrawable(Drawable drawable){
tv.setVisibility(View.GONE);
iv.setVisibility(View.VISIBLE);
iv.setImageDrawable(drawable);
}
}