大家好,我是小黑,一个还没秃头的程序员~~~

独学而无友,则孤陋而寡闻--《礼记·学记》

今天的内容是自定义一个数组加减的控件,可以应用于购物车的数量选择,效果如下:

自定义实现了控件的默认值、最大值、最小值、步长的值的设置

(一)设置控件布局view_number.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:gravity="center_vertical">    <ImageView        android:id="@+id/iv_add"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@mipmap/icon_add_enable" />    <EditText        android:id="@+id/edit_value"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp"        android:background="@drawable/frame_with_gray_edge_white"        android:paddingLeft="15dp"        android:paddingTop="10dp"        android:paddingRight="15dp"        android:paddingBottom="10dp"        android:text="1"        android:textColor="#000"        android:textSize="14dp" />    <ImageView        android:id="@+id/iv_minus"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp"        android:background="@drawable/select_minus_switch" />LinearLayout>

按钮样式只实现了可不可点击状态的切换,大家也可自己实现单击状态的效果select_minus_switch.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@mipmap/icon_minus_disable" android:state_enabled="false" />    <item android:drawable="@mipmap/icon_minus_enable" android:state_enabled="true" />selector>

frame_with_gray_edge_white.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle">    <corners android:radius="5dp" />    <solid android:color="#fff" />    <stroke        android:width="0.5dp"        android:color="#c0c0c0" />shape>

(二)创建类并继承基本布局,加载视图,自定义属性设计获取以及使用自定义属性文件attrs_number_view.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="NumberView">        <attr name="min" format="integer" />        <attr name="max" format="integer" />        <attr name="step" format="integer" />        <attr name="defaultValue" format="integer" />    declare-styleable>resources>

NumberView.java代码如下:

public class NumberView extends LinearLayout {    private ImageView mIvAdd;    private ImageView mIvMinus;    private EditText mEditValue;    private int mCurrentValue;//当前的数值    private OnValueChangeListener mOnValueChangeListener;//值发生变化时的回调    private int mMax;//最大值    private int mMin;//最小值    private int mStep;//步长    private int mDefaultValue;//默认值        public int getMax() {        return mMax;    }    public void setMax(int max) {        mMax = max;    }    public int getMin() {        return mMin;    }    public void setMin(int min) {        mMin = min;    }    public int getStep() {        return mStep;    }    public void setStep(int step) {        mStep = step;    }    public int getDefaultValue() {        return mDefaultValue;    }    public void setDefaultValue(int defaultValue) {        mCurrentValue = mDefaultValue = defaultValue;        updateText();    }    public int getCurrentValue() {        return mCurrentValue;    }    //手动设置值需要更新UI    public void setCurrentValue(int currentValue) {        mCurrentValue = currentValue;        updateText();    }    public NumberView(Context context) {        this(context, null, 0);    }    public NumberView(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public NumberView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView(context);        getAttrs(context, attrs);    }    //获取自定义属性    private void getAttrs(Context context, AttributeSet attrs) {        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.NumberView);        mMax = typedArray.getInt(R.styleable.NumberView_max, 999999);        mMin = typedArray.getInt(R.styleable.NumberView_min, 0);        mStep = typedArray.getInt(R.styleable.NumberView_step, 1);        mDefaultValue = typedArray.getInt(R.styleable.NumberView_defaultValue, 1);        mCurrentValue = mDefaultValue;//当前值等于默认值        if (mCurrentValue == mMin) {//当前值为最小值时减号不能点击            mIvMinus.setEnabled(false);        } else {            mIvMinus.setEnabled(true);        }    }    //加载布局,定义控件以及设置监听    private void initView(Context context) {        View inflate = LayoutInflater.from(context).inflate(R.layout.view_number, this, false);        this.addView(inflate);        mIvAdd = inflate.findViewById(R.id.iv_add);        mIvMinus = inflate.findViewById(R.id.iv_minus);        mEditValue = inflate.findViewById(R.id.edit_value);        mIvAdd.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {               //先加完再比较,只要一点加号,减号就可以点击了                mCurrentValue += mStep;                mIvMinus.setEnabled(true);                //为了防止超过最大值,最后一步将最大值设置成当前值                if (mCurrentValue >= mMax) {                    mCurrentValue = mMax;                    mIvAdd.setEnabled(false);                }                //更新UI                updateText();                //回调当前值                if (mOnValueChangeListener != null) {                    mOnValueChangeListener.onValueChange(mCurrentValue);                }            }        });        mIvMinus.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                //减号与加号同理                mCurrentValue -= mStep;                mIvAdd.setEnabled(true);                if (mCurrentValue <= mMin) {                    mCurrentValue = mMin;                    mIvMinus.setEnabled(false);                }                updateText();                if (mOnValueChangeListener != null) {                    mOnValueChangeListener.onValueChange(mCurrentValue);                }            }        });    }    private void updateText() {        mEditValue.setText(mCurrentValue + "");    }    public interface OnValueChangeListener {        void onValueChange(int value);    }    public void setOnValueChangeListener(OnValueChangeListener onValueChangeListener) {        mOnValueChangeListener = onValueChangeListener;    }

在Activity中的控件使用:

 NumberView numberView = findViewById(R.id.view_number);        numberView.setOnValueChangeListener(new NumberView.OnValueChangeListener() {            @Override            public void onValueChange(int value) {                Toast.makeText(NumberViewActivity.this, "The current value is :"+value, Toast.LENGTH_SHORT).show();            }        });

到此为止,一个关于数字加减选择的自定义控件就已经完成了,是不是很简单,注释也写得很清楚,大家也可以自己添加各种自定义属性,如数值的精度以及按钮的样式等等,最后,祝大家身体健康,万事如意,感谢大家的支持与阅读!

获取控件enable状态_Android自定义组合控件数字加减(适用于购物车)相关推荐

  1. Android View体系(十)自定义组合控件

    相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

  2. 自定义组合控件:Banner、轮播图、广告栏控件

    1. 项目概述 这里,我们使用自定义组合控件实现一个自动轮播的广告条,也叫轮播图,完整版的效果图如下图所示.其实,这就是我们经常见到的滚动广告,默认情况下每隔N 秒会自动滚动,用手指左右滑动时也会切换 ...

  3. Android 自定义组合控件小结

    Android 自定义组合控件小结 引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控 ...

  4. Android 手机卫士--自定义组合控件构件布局结构

    由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...

  5. 自定义组合控件:下拉选择框

    Spinner 自定义组合控件之下拉选择框 项目概述 下拉选择框主要是通过在EditText 下用PopupWindow 动态显示ListView 控件来实现的.下拉选择框可以方便用户的输入效率,以此 ...

  6. Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件

    目标:实现EditText和Button组合成带有清空EditText内容功能的复合控件,可以通过代码设置自定义控件的相关属性. 实现效果为: (1)在res/layout目录下编写自定义组合控件的布 ...

  7. Android自定义组合布局,Android 流式布局 + 自定义组合控件

    自定义组合控件 package yanjupeng.bawei.com.day09.two; import android.content.Context; import android.util.A ...

  8. Android Studio自定义组合控件

    在Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件.  本文就详细讲述这一过程.虽然这样的View的组合有一个粒度的问题.粒度太大了无法复用,粒度太 ...

  9. Android自定义View 自定义组合控件

    自定义组合控件: 以三国杀游戏武将为例,包括武将头像,血条,装备区 1.先定义该组合的XML文件布局 1 <?xml version="1.0" encoding=" ...

最新文章

  1. 履带机器人运动控制器c++_敏捷得像猫,被抛出后能平稳着地,有意思的美国西点军校机器人!...
  2. 人脸特征值能存放在sql server中吗_钥匙丢了进不了门,Out了!只要自己没丢就能进门...
  3. php websocket 心跳包,websocket 心跳包重连
  4. oracle 创建视图时提示自定义的函数功能名不管用_PCS 7 CFC的常用功能与操作
  5. HTML阅读位置,script在HTML文档中位置
  6. 自训练:超越预训练,展现强大互补特性的上分新范式!
  7. DTO,VO,POJO,JavaBeans之间的区别?
  8. tar包zip的拆分与合并
  9. PAT1104 Sum of Number Segments精度问题
  10. Cesium笔记之加载GIF图
  11. 台式低速常温离心机S400操作规程
  12. 阿里云天池学习赛-零基础入门数据分析-学术前沿趋势分析(task1)
  13. 进阶高级自动化测试测试,Docker 常遇问题整理(带解决方案)
  14. python turtle怎么画海绵宝宝_画师绘制海绵宝宝性转拟人,派大星变小帅哥,又脑补一出甜蜜大戏...
  15. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式
  16. 校园超市购物系统(JAVA,JSP,SSM,MYSQL)
  17. 细粒度情感三元组抽取任务及其最新进展
  18. 游戏开发中的数据结构
  19. unity 代码热更+资源管理框架总结
  20. EVE-NG 透明模式 Transparent

热门文章

  1. zabbix server is not running the information displayed may not be current
  2. 深度解读 MongoDB 最全面的增强版本 4.4 新特性
  3. 五个问答,告诉你阿里云对象存储如何助力钉钉战胜业务洪峰
  4. Spotify如何使用Cassandra实现个性化推荐
  5. 哪种人是软件设计中的稀缺型人才?
  6. 如何在云上使用confd+ACM管理敏感数据
  7. 如何实现“持续集成”?闲鱼把研发效率翻了个翻
  8. 像数据科学家一样思考:12步指南(中)
  9. 阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行
  10. 到底什么成就了今天的人工智能?(上)