android自定义模拟勾选框

  • Post author:
  • Post category:其他


android是默认是有CheckBox的,但是这种定死的多选框太难看了。

要想让其变得好看的话就需要重写其中的方法,但是重写原方法的文章我搜到的比较少,加上时间比较紧张了,所以就来不及去研究那些源码了。

所以就自己利用ImageButton做了一个类似的,这并不是真正意义上的多选框,但是实现了多选框的功能。感觉效果还不错。

效果图如下:

至于原理很简单:

每一个选项就是一个LinearLayout

每个LinearLayout里面包含一个TextView和一个ImageButton,而我们只需要对ImageButton添加监听就可以了。

代码如下:

public class SetRMPLDialog extends RelativeLayout{
	
	private Context parentContext;
	private android.view.ViewGroup.LayoutParams lp;
	
	/**布局*/
	private TextView showtitle;
	private int showtitleid=41310;
	
	private RelativeLayout allitem;
	private int allitemid=41320;
	private Map<Integer,OneItem> itemmap;
	
	private Button okBtn;
	private Button exitBtn;
	
	private PitchListen pitchlisten;//对按钮的监听
	private BtnListen btnlisten;//对确定和退出按钮的监听

	public SetRMPLDialog(Context context) {
		super(context);
		this.parentContext=context;
		pitchlisten=new PitchListen();
		btnlisten=new BtnListen();
		init();
	}
	
	private void init() {
		showtitle=new TextView(parentContext);
		showtitle.setText("请选择屏蔽号码的位数");
		showtitle.setId(showtitleid);
		LayoutParams lpshowtitle=new LayoutParams(-2,-2);
		lpshowtitle.addRule(RelativeLayout.ALIGN_PARENT_TOP);
		lpshowtitle.addRule(RelativeLayout.CENTER_HORIZONTAL);
		
		
		allitem=new RelativeLayout(parentContext);
		allitem.setId(allitemid);
		LayoutParams lpallitem=new LayoutParams(-2,200);
		lpallitem.addRule(RelativeLayout.BELOW,showtitleid);
		itemmap=new HashMap<Integer, SetRMPLDialog.OneItem>();
		//创建显示列表
		createItem();
		
		okBtn=new Button(parentContext);
		okBtn.setText("确定");
		LayoutParams lpokBtn=new LayoutParams(-2,-2);
		lpokBtn.setMargins(20, 0, 0, 0);
		lpokBtn.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
		lpokBtn.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
		
		exitBtn=new Button(parentContext);
		exitBtn.setText("退出");
		LayoutParams lpexitBtn=new LayoutParams(-2,-2);
		lpexitBtn.setMargins(0, 0, 20, 0);
		lpexitBtn.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
		lpexitBtn.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
		
		addView(showtitle,lpshowtitle);
		addView(allitem,lpallitem);
		addView(okBtn,lpokBtn);
		addView(exitBtn,lpexitBtn);
	}

	public void createItem(){
		for(int i=5;i<=13;i++){
			OneItem oneitem=new OneItem(parentContext, i);
			allitem.addView(oneitem,oneitem.getLpitem());
			itemmap.put(oneitem.getI(), oneitem);
		}
	}

	public android.view.ViewGroup.LayoutParams getLp() {
		lp=new android.view.ViewGroup.LayoutParams(-1,300);
		return lp;
	}
	
	class OneItem extends LinearLayout{
		int i;
		TextView text;
		ImageButton sel;
		android.widget.RelativeLayout.LayoutParams lpitem;
		public OneItem(Context context,int i) {
			super(context);
			this.i=i;
			text=new TextView(parentContext);
			text.setText((i!=13)?i+"位:":"13+"+"位:");
			LayoutParams lptext=new LayoutParams(70,40);
			lptext.setMargins(0, 5, 0, 5);
			sel=new ImageButton(parentContext);
			//添加图片选择资源
			sel.setBackgroundResource(R.drawable.nopitch);
			LayoutParams lpsel=new LayoutParams(40,40);
			lpsel.setMargins(5, 5, 5, 5);
			addView(text,lptext);
			addView(sel,lpsel);
			//添加测试的背景颜色
			this.setBackgroundColor(Color.CYAN);
			
			//对选项按钮添加监听
			sel.setOnClickListener(pitchlisten);
		}
		
		public android.widget.RelativeLayout.LayoutParams getLpitem(){
			lpitem=new android.widget.RelativeLayout.LayoutParams(120,50);
			switch (i%3) {
			case 0:
				//6.9.12
				lpitem.addRule(RelativeLayout.CENTER_HORIZONTAL);
				break;
			case 1:
				//7,10,13
				lpitem.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
				break;
				
			default:
				//5,8,11
				lpitem.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
				break;
			}
			switch ((i-5)/3) {
			case 0:
				lpitem.addRule(RelativeLayout.ALIGN_PARENT_TOP);
				break;
			case 1:
				lpitem.addRule(RelativeLayout.CENTER_VERTICAL);
				break;
			default:
				lpitem.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
				break;
			}
			
			return lpitem;
		}

		public int getI() {
			return i;
		}

		public void setI(int i) {
			this.i = i;
		}

		public TextView getText() {
			return text;
		}

		public void setText(TextView text) {
			this.text = text;
		}

		public ImageButton getSel() {
			return sel;
		}

		public void setSel(ImageButton sel) {
			this.sel = sel;
		}
		
		
	}

	class PitchListen implements OnClickListener {

		@Override
		public void onClick(View v) {
			Set<Integer> pitchSet = DBHelper.getPitchSet();
			if (v instanceof ImageButton) {
				ImageButton sel = (ImageButton) v;
				OneItem oneitem = (OneItem) sel.getParent();
				int i=oneitem.getI();
				Log.i("tag", "选择了"+i+"号按钮");
				if(pitchSet.contains(i)){
					oneitem.getSel().setBackgroundResource(R.drawable.nopitch);
					pitchSet.remove(i);
				}else{
					oneitem.getSel().setBackgroundResource(R.drawable.pitch);
					pitchSet.add(i);
				}
			}
		}
	}
	
	class BtnListen implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			if(v==okBtn){
				Log.i("tag", "okBtn");
			}else if(v==exitBtn){
				Log.i("tag", "exitBtn");
			}else{
				Log.e("error", this.toString()+"监听按钮出异常了");
			}
		}
		
	}
}

DBHelper类:

public class DBHelper {
	static Map<String,User> blackmap;
	static Map<String,User> whitemap;
	static Set<String> selectset;
	static Map<String,String> dustbin;
	static Set<Integer> pitchset;
	
	public static Set<Integer> getPitchSet(){
		if(pitchset==null){
			pitchset=new HashSet<Integer>();
		}
		return pitchset;
	}
}

然后,大功告成了,应该实现了多选框的功能。

下面我还设定了2个按钮,分别为提交和取消,提交的话直接上传一个Set集合就可以了。