Android 购物车加减器控件的实现, 效果图如下:
[caption id=”attachment_259” align=”aligncenter” width=”240”] 购物车加减器[/caption]
实现功能:点击加号数值增加,点击减号数值递减, 点击数值区域可以手动输入数值。
布局可以使用左右各一个button,中间是一个edittext . 因为button 显示效果会有padding 加减号显示的比较小, 所有我改用了textView.,这样更多的空间可以设置文字的大小。好的, 到这里我们就知道界面上的控件都有那些了, 下面我们再说一下实现的逻辑步骤
首先 定义一个变量用来保存value ,按钮加减 要注册点击事件,点击按钮累加或者递减vaule 数值, 点击中间的EditText输入值并覆盖vaule的值,所以edittext 要实现
addTextChangedListener
监听,并且重写afterTextChanged方法, 在该方法中处理value的变化。
下面是源码 :
package com.dobest.fdnf.widget; import android.content.Context; import android.content.res.TypedArray; import android.os.Build; import android.support.annotation.RequiresApi; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.dobest.fdnf.R; /** * Created by Gordo on 2016/12/18. */ public class AdderWidget extends LinearLayout { private float adderHeight; private float adderWidth; private float btnTextSize; private float tvTextSize; private int tvTextColor; private int btnTextColor; private int btnWidth; private int btnHeight; private int tvBackground; private int btnBackground; private String TAG = this.getClass().getSimpleName(); private TextView btnMinus; private TextView btnAdd; private EditText textView; private int value = 1; @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public AdderWidget(Context context) { this(context, null); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public AdderWidget(Context context, AttributeSet attrs) { super(context, attrs); initView(context, attrs); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private void initView(Context context, AttributeSet attrs) { this.setOrientation(HORIZONTAL); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.adder_widget); adderHeight = typedArray.getDimension(R.styleable.adder_widget_adderHeight, 60); adderWidth = typedArray.getDimension(R.styleable.adder_widget_adderWidth, 100); btnHeight = typedArray.getDimensionPixelSize(R.styleable.adder_widget_adderBtnHeight, 60); btnWidth = typedArray.getDimensionPixelSize(R.styleable.adder_widget_adderBtnWidth, 60); tvTextColor = typedArray.getColor(R.styleable.adder_widget_adderTvTextColor, 0); tvTextSize = typedArray.getDimensionPixelSize(R.styleable.adder_widget_adderTvTextSize, 9); btnTextColor = typedArray.getColor(R.styleable.adder_widget_adderBtnTextColor, 0); btnTextSize = typedArray.getDimensionPixelSize(R.styleable.adder_widget_adderBtnTextSize, 9); btnBackground = typedArray.getColor(R.styleable.adder_widget_adderBtnBackground, 0); tvBackground = typedArray.getColor(R.styleable.adder_widget_adderTvBackground, 0); typedArray.recycle(); buildView(context); setListener(); } public AdderWidget(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void setListener() { btnAdd.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { value++; updateValue(); } }); btnMinus.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (value > 0) { value--; } else { value = 0; } updateValue(); } }); textView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { if (charSequence.toString().trim().equals("")) { value = 0; } else { value = Integer.valueOf(charSequence.toString()); } } @Override public void afterTextChanged(Editable editable) { if (value > 1000) { editable.replace(0, textView.getText().toString().length(), "1000"); value = 1000; Toast.makeText(getContext(), "最大只能到1000", Toast.LENGTH_SHORT).show(); } if (onAdderValueListener != null) { onAdderValueListener.onAdderValue(String.valueOf(value)); } } }); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private void buildView(Context context) { btnMinus = new TextView(context); btnMinus.setGravity(Gravity.CENTER); btnMinus.setTextSize(TypedValue.COMPLEX_UNIT_PX, btnTextSize); btnMinus.setTextColor(btnTextColor); btnMinus.setText("-"); btnMinus.setElevation(4); btnMinus.setBackgroundColor(btnBackground); LayoutParams params = new LayoutParams(btnWidth, ViewGroup.LayoutParams.MATCH_PARENT); btnMinus.setLayoutParams(params); btnAdd = new TextView(context); btnAdd.setLayoutParams(params); btnAdd.setGravity(Gravity.CENTER); btnAdd.setTextSize(TypedValue.COMPLEX_UNIT_PX, btnTextSize); btnAdd.setTextColor(btnTextColor); btnAdd.setElevation(4); btnAdd.setBackgroundColor(btnBackground); btnAdd.setText("+"); textView = new EditText(context); LayoutParams tvParams = new LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1); tvParams.setMargins(2, 0, 2, 0); textView.setLayoutParams(tvParams); textView.setGravity(Gravity.CENTER); textView.setTextColor(tvTextColor); textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, tvTextSize); textView.setInputType(InputType.TYPE_CLASS_NUMBER); textView.setBackgroundColor(tvBackground); textView.setPadding(0, 0, 0, 0); textView.setElevation(4); textView.setCursorVisible(true); this.addView(btnMinus); this.addView(textView); this.addView(btnAdd); updateValue(); } private void updateValue() { String adderValue = ""; if (value > 1000) { adderValue = "1000"; value = 1000; Toast.makeText(getContext(), "最大只能到1000", Toast.LENGTH_SHORT).show(); } else { adderValue = String.valueOf(value); } textView.setText(adderValue); if (onAdderValueListener != null) { onAdderValueListener.onAdderValue(adderValue); } } public void setTextValue(int value) { this.value = value; textView.setText(String.valueOf(this.value)); } private OnAdderValueListener onAdderValueListener; public void setOnAdderValueListener(OnAdderValueListener onAdderValueListener) { this.onAdderValueListener = onAdderValueListener; } public interface OnAdderValueListener { void onAdderValue(String value); } }
自定义的属性
在项目中和button 一样使用如下:
注意这里 因为使用了自定义的属性,所以要引入
xmlns:adder="http://schemas.android.com/apk/res-auto"
才能正常使用。
控件使用自定义背景
名称style_adder_bg
在java中如下使用
adderWidget.setOnAdderValueListener(new AdderWidget.OnAdderValueListener() { @Override public void onAdderValue(String value) { filedVaule = Integer.valueOf(value); ToastUtils.toastShort(context, value); } });
onAdderValue()方法中的形参就是传出的value .