仿京东购物车加减数量的自定义View

NumberAddSubView:
public class NumberAddSubView extends LinearLayout implements View.OnClickListener {
    private Button btn_sub;
    private Button btn_add;
    private TextView tv_num;
    private Context mContext;

    /**
     * 设置默认值
     */
    private int value = 1;
    private int minValue = 1;
    private int maxValue = 5;

    public NumberAddSubView(Context context) {
        this(context, null);
    }

    public NumberAddSubView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public NumberAddSubView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        initView(context);
        //得到属性
        if (attrs != null) {
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NumberAddSubView);
            //TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, R.styleable.NumberAddSubView, defStyleAttr, 0);
            int value = a.getInt(R.styleable.NumberAddSubView_value, 0);
            setValue(value);

            int maxValue = a.getInt(R.styleable.NumberAddSubView_maxValue, 0);
            setMaxValue(maxValue);

            int minValue = a.getInt(R.styleable.NumberAddSubView_minValue, 0);
            setMinValue(minValue);

            Drawable btnSubBackground = a.getDrawable(R.styleable.NumberAddSubView_btnSubBackground);
            if (btnSubBackground != null)
                btn_sub.setBackground(btnSubBackground);

            Drawable btnAddBackground = a.getDrawable(R.styleable.NumberAddSubView_btnAddBackground);
            if (btnAddBackground != null)
                btn_sub.setBackground(btnAddBackground);

            Drawable textViewBackground = a.getDrawable(R.styleable.NumberAddSubView_textViewBackground);
            if (textViewBackground != null)
                tv_num.setBackground(textViewBackground);

            a.recycle();
        }
    }

    private void initView(Context context) {
        //第三个参数:把当前View加载到NumberAddSubView控件上
        View.inflate(context, R.layout.number_add_sub_view, this);
        btn_sub = (Button) findViewById(R.id.btn_sub);
        btn_add = (Button) findViewById(R.id.btn_add);
        tv_num = (TextView) findViewById(R.id.tv_num);

        btn_sub.setOnClickListener(this);
        btn_add.setOnClickListener(this);
    }

    public int getValue() {
        String val = tv_num.getText().toString();
        if (!TextUtils.isEmpty(val)) {
            value = Integer.parseInt(val);
        }
        return value;
    }

    public void setValue(int value) {
        this.value = value;
        tv_num.setText(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;
    }


    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_sub) {
//            Toast.makeText(mContext,"减",Toast.LENGTH_SHORT).show();

            subNum();
            if (onButtonClickListenter != null) {
                onButtonClickListenter.onButtonSubClick(v, value);
            }
        } else if (v.getId() == R.id.btn_add) {
//            Toast.makeText(mContext,"加",Toast.LENGTH_SHORT).show();
            addNum();
            if (onButtonClickListenter != null) {
                onButtonClickListenter.onButtonAddClick(v, value);
            }
        }
    }

    /**
     * 减少数据
     */
    private void subNum() {
        if (value > minValue) {
            value = value - 1;
            tv_num.setText(value + "");
        }
    }

    /**
     * 添加数据
     */
    private void addNum() {
        if (value < maxValue) {
            value = value + 1;
            tv_num.setText(value + "");
        }
    }

    public interface OnButtonClickListenter {
        /**
         * 当增加按钮被点击的时候回调该方法
         *
         * @param view
         * @param value
         */
        public void onButtonAddClick(View view, int value);

        /**
         * 当减少按钮被点击的时候回调这个方法
         *
         * @param view
         * @param value
         */
        public void onButtonSubClick(View view, int value);
    }

    private OnButtonClickListenter onButtonClickListenter;

    public void setOnButtonClickListenter(OnButtonClickListenter onButtonClickListenter) {
        this.onButtonClickListenter = onButtonClickListenter;
    }
}
XML---number_add_sub_view.xml:
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="25dp"
    android:background="@drawable/selector_number_add_sub"
    android:orientation="horizontal">

    <Button
        android:id="@+id/btn_sub"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:background="@drawable/bg_btn_style_white"
        android:text="-"
        android:textColor="#000000"
        android:textSize="14sp" />

    <TextView
        android:id="@+id/tv_num"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:gravity="center"
        android:minWidth="100dp"
        android:text="1" />

    <Button
        android:id="@+id/btn_add"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:background="@drawable/bg_btn_style_white"
        android:text="+"
        android:textColor="#000000"
        android:textSize="14sp" />

LinearLayout>
自定义属性:
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="btnAddBackground" format="reference"/>
        <attr name="btnSubBackground" format="reference"/>
        <attr name="textViewBackground" format="reference"/>
    declare-styleable>

resources>
bg_btn_style_white.xml:
 
  
xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <corners android:radius="2.0dp" />
            <solid android:color="#7fd8d8d8" />
            <stroke android:width="1.0dp" android:color="#dddddd" />
        shape>
    item>
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="2.0dp" />
            <solid android:color="#ffd8d8d8" />
            <stroke android:width="1.0dp" android:color="#ddd" />
        shape>
    item>
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="2.0dp" />
            <solid android:color="#ffffff" />
            <stroke android:width="1.0dp" android:color="#dddddd" />
        shape>
    item>

selector>
selector_number_add_sub.xml:
 
  
xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="2dp" />
    <stroke
        android:width="1dp"
        android:color="#dddddd" />
    <solid android:color="#FFFFFF" />
shape>
代码:
number_add_sub_view.setOnButtonClickListenter(new NumberAddSubView.OnButtonClickListenter() {
    @Override
    public void onButtonAddClick(View view, int value) {
        //数量+触发
    }

    @Override
    public void onButtonSubClick(View view, int value) {
        //数量-触发
    }
});

你可能感兴趣的:(仿京东购物车加减数量的自定义View)