实现步骤:
1.先定义加减数字控件的layout布局
2.然后编写一个类继承自Linearlayout,在里面实例化上面的布局layout,和layout里面的各个控件,然后设置各种控件的点击事件,在加入各个控件的属性
3.自定义属性的步骤
1.首先在values中新建一个名字为attr_number_add_sub的文件,然后在里面写对于各个属性资源的加载引用,然后在在上面的类中进行加载引用
4.最后使用这个自定义的控件的时候,在layout布局中直接加入就可以了
代码:
1.wighet_number_add_sub的layout
<?xml version="1.0" encoding="utf-8"?> <!--自定义加减控件--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/selector_number_add_sub" android:padding="5dp"> <Button android:id="@+id/btn_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:text="+"/> <TextView android:id="@+id/txt_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:textColor="#000" android:minWidth="100dp"/> <Button android:id="@+id/btn_sub" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="-" android:padding="5dp"/> </LinearLayout>
2.自定义属性:首先在values中新建attr_number_add_sub文件,然后在drawable中定义selector_number_add_sub文件:
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="value" format="integer|reference"/> <attr name="minValue" format="integer|reference"/> <attr name="manValue" format="integer|reference"/> <attr name="btnAddBackground" format="reference"/> <attr name="btnSubBackground" format="reference"/> <attr name="textViewBackground" format="reference"/> <declare-styleable name="NumberAddSubView"> <attr name="value"/> <attr name="minValue"/> <attr name="manValue"/> <attr name="btnAddBackground"/> <attr name="btnSubBackground"/> <attr name="textViewBackground"/> </declare-styleable> </resources>
<?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="#ddd"/> <solid android:color="#FFFFFF" /> </shape>
3.NumberAddSubView类
package zuo.com.ui.number; import android.annotation.TargetApi; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.v7.widget.TintTypedArray; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import zuo.com.ui.R; /** * Created by <a href="http://www.cniao5.com">菜鸟窝</a> * 一个专业的Android开发在线教育平台 */ public class NumberAddSubView extends LinearLayout implements View.OnClickListener { private LayoutInflater mInflater; private Button mBtnAdd; private Button mBtnSub; private TextView mTextNum; private int value; private int minValue; private int maxValue; private OnButtonClickListener mOnButtonClickListener; 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); mInflater = LayoutInflater.from(context); initView(); if(attrs!=null){ TintTypedArray a = TintTypedArray.obtainStyledAttributes(context,attrs, R.styleable.NumberAddSubView,defStyleAttr,0); int val = a.getInt(R.styleable.NumberAddSubView_value,0); setValue(val); int minVal = a.getInt(R.styleable.NumberAddSubView_minValue,0); setMinValue(minVal); int maxVal = a.getInt(R.styleable.NumberAddSubView_manValue,0); setMaxValue(maxVal); Drawable drawableBtnAdd =a.getDrawable(R.styleable.NumberAddSubView_btnAddBackground); Drawable drawableBtnSub =a.getDrawable(R.styleable.NumberAddSubView_btnSubBackground); Drawable drawableTextView =a.getDrawable(R.styleable.NumberAddSubView_textViewBackground); setButtonAddBackgroud(drawableBtnAdd); setButtonSubBackgroud(drawableBtnSub); setTexViewtBackground(drawableTextView); a.recycle(); } } private void initView(){ View view = mInflater.inflate(R.layout.wieght_number_add_sub,this,true); mBtnAdd = (Button) view.findViewById(R.id.btn_add); mBtnSub = (Button) view.findViewById(R.id.btn_sub); mTextNum = (TextView) view.findViewById(R.id.txt_num); mBtnAdd.setOnClickListener(this); mBtnSub.setOnClickListener(this); } public int getValue() { String val = mTextNum.getText().toString(); if(val !=null && !"".equals(val)) this.value = Integer.parseInt(val); return value; } public void setValue(int value) { mTextNum.setText(value+""); this.value = 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 void setOnButtonClickListener(OnButtonClickListener onButtonClickListener) { this.mOnButtonClickListener = onButtonClickListener; } @Override public void onClick(View v) { if (v.getId() == R.id.btn_add) { numAdd(); if (mOnButtonClickListener != null) { mOnButtonClickListener.onButtonAddClick(v,value); } } else if (v.getId() == R.id.btn_sub) { numSub(); if (mOnButtonClickListener != null) { mOnButtonClickListener.onButtonSubClick(v,value); } } } private void numAdd(){ if(value<maxValue) value=value+1; mTextNum.setText(value+""); } private void numSub(){ if(value>minValue) value=value-1; mTextNum.setText(value+""); } public void setTexViewtBackground(Drawable drawable){ mTextNum.setBackgroundDrawable(drawable); } public void setTextViewBackground(int drawableId){ setTexViewtBackground(getResources().getDrawable(drawableId)); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void setButtonAddBackgroud(Drawable backgroud){ this.mBtnAdd.setBackground(backgroud); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void setButtonSubBackgroud(Drawable backgroud){ this.mBtnSub.setBackground(backgroud); } public interface OnButtonClickListener{ void onButtonAddClick(View view,int value); void onButtonSubClick(View view,int value); } }
<zuo.com.ui.number.NumberAddSubView android:layout_width="wrap_content" android:layout_height="wrap_content" app:value="1" app:manValue="5" app:minValue="1"></zuo.com.ui.number.NumberAddSubView>