public class NumberAddSubView extends LinearLayout implements View.OnClickListener {
private ImageView btn_sub;
private ImageView btn_add;
private TextView tv_count;
private int value = 1;
private int minValue = 1;
private int maxValue = 10;
public int getValue() {
String countStr = tv_count.getText().toString().trim();//文本内容
if (countStr != null) {
value = Integer.valueOf(countStr);
}
return value;
}
public void setValue(int value) {
this.value = value;
tv_count.setText(String.valueOf(value));
}
public int getMinValue() {
return minValue;
}
public void setMinValue(int minValue) {
this.minValue = minValue;
}
public int getMaxValue() {
return maxValue;
}
public void setMaxValue(int maxValue) {
this.maxValue = maxValue;
}
public NumberAddSubView(Context context) {
this(context, null);
}
public NumberAddSubView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public NumberAddSubView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//把布局和当前类形成整体
View.inflate(context, R.layout.number_add_sub_layout, this);
btn_sub = (ImageView) findViewById(R.id.btn_sub);
btn_add = (ImageView) findViewById(R.id.btn_add);
tv_count = (TextView) findViewById(R.id.tv_count);
getValue();
//设置点击事件
btn_add.setOnClickListener(this);
btn_sub.setOnClickListener(this);
if (attrs != null) {
//取出属性
TintTypedArray tintTypedArray = TintTypedArray.obtainStyledAttributes(context, attrs, R.styleable.NumberAddSubView);
int value = tintTypedArray.getInt(R.styleable.NumberAddSubView_value, 0);
if (value > 0) {
setValue(value);
}
int minValue = tintTypedArray.getInt(R.styleable.NumberAddSubView_minValue, 0);
if (value > 0) {
setMinValue(minValue);
}
int maxValue = tintTypedArray.getInt(R.styleable.NumberAddSubView_maxValue, 0);
if (value > 0) {
setMaxValue(maxValue);
}
Drawable addDrawable = tintTypedArray.getDrawable(R.styleable.NumberAddSubView_numberAddBackground);
if (addDrawable != null) {
btn_add.setImageDrawable(addDrawable);
}
Drawable subDrawable = tintTypedArray.getDrawable(R.styleable.NumberAddSubView_numberSubBackground);
if (subDrawable != null) {
btn_sub.setImageDrawable(subDrawable);
}
}
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_add) {
//加
addNumber();
if (onNumberChangeListener != null) {
onNumberChangeListener.addNumber(v, value);
}
} else {
//减
subNumber();
if (onNumberChangeListener != null) {
onNumberChangeListener.subNumner(v, value);
}
}
}
private void subNumber() {
if (value > minValue) {
value -= 1;
}
setValue(value);
}
private void addNumber() {
if (value < maxValue) {
value += 1;
}
setValue(value);
}
public interface OnNumberChangeListener {
//当按钮被点击的时候回调
void addNumber(View view, int value);
void subNumner(View view, int value);
}
private OnNumberChangeListener onNumberChangeListener;
public void setOnNumberChangeListener(OnNumberChangeListener onNumberChangeListener) {
this.onNumberChangeListener = onNumberChangeListener;
}
private ImageView btn_sub;
private ImageView btn_add;
private TextView tv_count;
private int value = 1;
private int minValue = 1;
private int maxValue = 10;
public int getValue() {
String countStr = tv_count.getText().toString().trim();//文本内容
if (countStr != null) {
value = Integer.valueOf(countStr);
}
return value;
}
public void setValue(int value) {
this.value = value;
tv_count.setText(String.valueOf(value));
}
public int getMinValue() {
return minValue;
}
public void setMinValue(int minValue) {
this.minValue = minValue;
}
public int getMaxValue() {
return maxValue;
}
public void setMaxValue(int maxValue) {
this.maxValue = maxValue;
}
public NumberAddSubView(Context context) {
this(context, null);
}
public NumberAddSubView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public NumberAddSubView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//把布局和当前类形成整体
View.inflate(context, R.layout.number_add_sub_layout, this);
btn_sub = (ImageView) findViewById(R.id.btn_sub);
btn_add = (ImageView) findViewById(R.id.btn_add);
tv_count = (TextView) findViewById(R.id.tv_count);
getValue();
//设置点击事件
btn_add.setOnClickListener(this);
btn_sub.setOnClickListener(this);
if (attrs != null) {
//取出属性
TintTypedArray tintTypedArray = TintTypedArray.obtainStyledAttributes(context, attrs, R.styleable.NumberAddSubView);
int value = tintTypedArray.getInt(R.styleable.NumberAddSubView_value, 0);
if (value > 0) {
setValue(value);
}
int minValue = tintTypedArray.getInt(R.styleable.NumberAddSubView_minValue, 0);
if (value > 0) {
setMinValue(minValue);
}
int maxValue = tintTypedArray.getInt(R.styleable.NumberAddSubView_maxValue, 0);
if (value > 0) {
setMaxValue(maxValue);
}
Drawable addDrawable = tintTypedArray.getDrawable(R.styleable.NumberAddSubView_numberAddBackground);
if (addDrawable != null) {
btn_add.setImageDrawable(addDrawable);
}
Drawable subDrawable = tintTypedArray.getDrawable(R.styleable.NumberAddSubView_numberSubBackground);
if (subDrawable != null) {
btn_sub.setImageDrawable(subDrawable);
}
}
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_add) {
//加
addNumber();
if (onNumberChangeListener != null) {
onNumberChangeListener.addNumber(v, value);
}
} else {
//减
subNumber();
if (onNumberChangeListener != null) {
onNumberChangeListener.subNumner(v, value);
}
}
}
private void subNumber() {
if (value > minValue) {
value -= 1;
}
setValue(value);
}
private void addNumber() {
if (value < maxValue) {
value += 1;
}
setValue(value);
}
public interface OnNumberChangeListener {
//当按钮被点击的时候回调
void addNumber(View view, int value);
void subNumner(View view, int value);
}
private OnNumberChangeListener onNumberChangeListener;
public void setOnNumberChangeListener(OnNumberChangeListener onNumberChangeListener) {
this.onNumberChangeListener = onNumberChangeListener;
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:gravity="center"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/btn_sub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/goods_sub_btn"
android:text="-"
android:textSize="20sp" />
<TextView
android:id="@+id/tv_count"
android:layout_width="50dp"
android:layout_height="50dp"
android:gravity="center"
android:text="1"
android:textSize="20sp" />
<ImageView
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/goods_add_btn"
android:text="+"
android:textSize="20sp" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:gravity="center"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/btn_sub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/goods_sub_btn"
android:text="-"
android:textSize="20sp" />
<TextView
android:id="@+id/tv_count"
android:layout_width="50dp"
android:layout_height="50dp"
android:gravity="center"
android:text="1"
android:textSize="20sp" />
<ImageView
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/goods_add_btn"
android:text="+"
android:textSize="20sp" />
</LinearLayout>
在values下新建number_add_sub_view_attrs.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="NumberAddSubView">
<attr name="value" format="integer|reference" />
<attr name="minValue" format="integer|reference" />
<attr name="maxValue" format="integer|reference" />
<attr name="numberAddBackground" format="reference" />
<attr name="numberSubBackground" format="reference" />
</declare-styleable>
</resources>
<resources>
<declare-styleable name="NumberAddSubView">
<attr name="value" format="integer|reference" />
<attr name="minValue" format="integer|reference" />
<attr name="maxValue" format="integer|reference" />
<attr name="numberAddBackground" format="reference" />
<attr name="numberSubBackground" format="reference" />
</declare-styleable>
</resources>