在项目中碰到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进行配置属性解析