1.控件布局
<?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.定义控件属性
<?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>3.自定义控件
package cniao5.com.numberaddsubview;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.internal.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;
/**
* 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);
}
}
4.使用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<cniao5.com.numberaddsubview.NumberAddSubView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:value="1"
app:manValue="5"
app:minValue="1"
></cniao5.com.numberaddsubview.NumberAddSubView>
</RelativeLayout>
本文详细介绍了如何在商城系统中实现一个自定义的数字加减控件,从控件布局、属性定义到具体实现步骤,最后展示了如何在实际应用中使用该组件。
3789

被折叠的 条评论
为什么被折叠?



