Android自定义CheckBox

     在项目中碰到CheckBox在不同的手机上会出现一些布局上的问题,于是调查发现Android 的控件 CheckBox 和 RadioButton 在配合一些复杂的地方使用、比如和 ImageView、TextView等控件配合使用完成一些复杂的功能的时候会出现兼容性问题、如果使用了 paddingLeft 来使用按钮和文字之间有一定距离的时候、在Android 4.2 以下的机器上面会出现文字偏移的问题,那么针对这一现象,如果实在找不到简单的解决方法,只好自己封装一个 CheckBox 了。

1、以下主要核心代码:CustomCheckBox.java

package com.example.liujc;

import java.lang.ref.WeakReference;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class CustomCheckBox extends LinearLayout implements OnClickListener{
	private float mSpacing;//文字与图标的间距值
//	private int mImageRes;
	private int mTextSize;//文字字体大小
	private int mTextColor;//文字字体颜色
	private String mText;
	private boolean mChecked;
	
	private ImageView mCheckBox;
//	private ImageView mImageView;
	private TextView mTextView;
	
	private WeakReference<OnCustomCheckBoxClickListener> mListener;
	
	public CustomCheckBox(Context context) {
		super(context);
	}

	public CustomCheckBox(Context context, AttributeSet attrs) {
		super(context, attrs);
		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomCheckBox);  
		mChecked = a.getBoolean(R.styleable.CustomCheckBox_checked, false);
		mTextSize = a.getInt(R.styleable.CustomCheckBox_ctext_size, 14);
		mTextColor = a.getColor(R.styleable.CustomCheckBox_ctext_color, 0XFF333333); 
		mText = a.getString(R.styleable.CustomCheckBox_ctext);
//		mImageRes = a.getResourceId(R.styleable.CustomCheckBox_src, -1);
		mSpacing = a.getDimension(R.styleable.CustomCheckBox_spacing, 22);
		a.recycle();
		
		LayoutInflater.from(context).inflate(R.layout.widget_my_checkbox, this, true);
		mCheckBox = (ImageView)this.findViewById(R.id.my_checkbox);
		mCheckBox.setSelected(mChecked);
		
//		mImageView = (ImageView)this.findViewById(R.id.my_checkbox_images);
//		if(-1 != mImageRes){
//			mImageView.setBackgroundResource(mImageRes);
//			LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(36, 36);
//	        lp.setMargins(mSpacing, 0, 0, 0);
//	        mImageView.setLayoutParams(lp);
//	        mImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
//	        mImageView.setVisibility(View.VISIBLE);
//		}
		
		mTextView = (TextView)this.findViewById(R.id.my_checkbox_text);
		if(null != mText){
	        mTextView.setText(mText);
//			mTextView.setText("测试机");
	        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
	        		android.view.ViewGroup.LayoutParams.WRAP_CONTENT, 
	        		android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
	        lp.setMargins((int) mSpacing, 0, 0, 0);
	        mTextView.setLayoutParams(lp);
	        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP ,mTextSize);
	        mTextView.setTextColor(mTextColor);
	        mTextView.setVisibility(View.VISIBLE);
		}
		
		
		View v = this.findViewById(R.id.my_checkbox_linearLayout);
		v.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		mCheckBox.setSelected(!mChecked);
		mChecked = !mChecked;
		if(null != mListener && null != mListener.get()){
			mListener.get().onCustomCheckBoxClick(CustomCheckBox.this);
		}
	}
	
	public void setOnCustomCheckBoxClickListener(OnCustomCheckBoxClickListener listener) {
		mListener = new WeakReference<OnCustomCheckBoxClickListener>(listener);
	}
	
	public interface OnCustomCheckBoxClickListener {
        abstract void onCustomCheckBoxClick(View v);
    }

	public void setChecked(boolean isAllCheck) {
		mCheckBox.setSelected(isAllCheck);
	}

	public boolean isChecked() {
		mChecked = mCheckBox.isSelected();
		return mChecked;
	}

	public String getmText() {
		return mText;
	}
	
}

2、在sttrs.xml中添加自定义的属性

<declare-styleable name="CustomCheckBox">
        <attr name="spacing" format="dimension" />
        <attr name="ctext" format="reference" />
        <attr name="ctext_size" format="integer" />
        <attr name="ctext_color" format="color" />
        <attr name="checked" format="boolean" />
        <attr name="src" format="reference" />
    </declare-styleable>

3、自定义的CheckBox的布局文件widget_my_checkbox.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_checkbox_linearLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:clickable="true"
    android:focusable="true" >

    <ImageView
        android:id="@+id/my_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/app_name"
        android:layout_gravity="center_vertical"
        android:background="@drawable/checkbox_selected"
        android:clickable="false"
        android:gravity="center_vertical" />

    <!-- <ImageView
        android:id="@+id/my_checkbox_images"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:contentDescription="@string/app_name"
        android:gravity="center_vertical"
        android:scaleType="fitCenter"
        android:visibility="gone" /> -->

    <TextView
        android:id="@+id/my_checkbox_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:ellipsize="end"
        android:gravity="center_vertical"
        android:singleLine="true"
        android:visibility="visible" />

</LinearLayout>
4、调用时,直接在布局文件xml中将相应的控件名写出即可

<com.example.liujc.CustomCheckBox
        android:id="@+id/homepic_quickbuy_view"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        rgb:ctext= "@string/custom_myCheckBoxe"
        rgb:spacing= "11dp"
        />
具体如何使用如果还不了解,请参考: android 自定义圆角头像以及使用declare-styleable进行配置属性解析


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值