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

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

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

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

3bd35953ba6e7a29e7eaf01fbbc8adfe.gif

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

(一)设置控件布局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();            }        });

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IPv6转换服务正式发布

摘要&#xff1a; IPv6时代已来&#xff0c;阿里云IPv6转换服务帮忙您使现有IPv4业务快速提供IPv6访问能力 什么是IPv6转换服务 IPv6转换服务&#xff08;IPv6 Translation Service&#xff09;是阿里云提供的一种有状态的IPv6和IPv4网络地址和协议转换服务。 通过IPv6转换服…

【角度刁钻】如果把线程当作一个人来对待,秒懂

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 编程新说李新杰责编 | 阿秃多线程的问题都曾经困扰过每个开发人员&#xff0c;今天将从全新视角来解说&#xff0c;希望读者都能明白。强烈建议去运行下文章中的示例代码&#xff0c;自己体会下。问题究竟出在哪里&#xff…

时间序列数据卡尔曼滤波_使用Highcharts和InfluxDB可视化时间序列数据

实时绘制大量带时间戳的数据往往是一项棘手的任务&#xff0c;需要相当多的技巧和过多的耐心。幸运的是&#xff0c;我们已经有了InfluxData平台来为我们提供开箱即用的许多困难。我们可以高效&#xff0c;安全地收集和存储数据&#xff0c;构建可视化&#xff0c;甚至设置警报…

AI又破案!衢州城市大脑这回抓了一个抢劫犯

摘要&#xff1a; 浙江衢州再次上演AI破案的神迹&#xff1a;两周时间内&#xff0c;衢化西路、巨化西路连续发生两起金项链抢劫案。受案发现场条件限制&#xff0c;视频侦查问题重重。在衢州城市大脑的帮助下&#xff0c;警方最终锁定犯罪嫌疑人马某并进行逮捕。经查&#xff…

用javascript进行一个简单的机器学习小实例

摘要&#xff1a; 本篇文章教你如何使用JavaScript在浏览器中完整地定义、训练和部署机器学习算法。 虽然它可能不是机器学习传统选择的开发语言&#xff0c;但是JavaScript正在证明有能力完成这样的工作——即使它目前还不能与主要的机器学习语言Python竞争。在进一步学习之前…

梳子刻字刻什么好_校园石阶上被人刻了1700多个字?!这次网友却说好

在公共场合刻字&#xff0c;是不是听上去不太文明&#xff1f;但凡事都有例外&#xff01;在云南怒江的一个小学&#xff0c;一个支教老师在学校的石砖上刻下了上千个字&#xff0c;他为的不是“到此一游”&#xff0c;而是将汉字知识永远传承下去...△视频来源&#xff1a;看看…

腾讯Blade Team发现云虚拟化平台逃逸漏洞 积极护航云生态安全

随着云技术的快速发展和迭代更新&#xff0c;各行各业都在“云”中快速成长&#xff0c;安全性显得尤为重要。而云时代软硬件的“云交互”&#xff0c;对安全来说也意味着新的挑战。 近日&#xff0c;腾讯Blade Team团队在针对云上虚拟化安全研究中&#xff0c;发现了主流虚拟…

机器学习应用中的UI个性化

摘要&#xff1a; 在这篇文章中&#xff0c;我们看看关于机器学习应用中的UI个性化问题&#xff0c;谈一谈为什么在应用程序开发的过程中交流和沟通是成功的关键。 EdgVerve推出了基于AI的业务应用平台的新一代集成人工智能平台-Infosys Nia使你的企业能够管理特定的业务领域&a…

zookeeper集群部署 精简版本

文章目录1. zookeeper下载2. 解压3. 重命名4. 创建dataDir目录和dataLogDir日志目录5. 更新备份配置文件6. 添加数据目录和日志文件目录7. 添加集群信息7.1. ip配置 方式017.2. 域名配置 方式02&#xff08;推荐使用&#xff09;8. 在服务器上分别创建myid&#xff0c;各自写入…

物联网火爆,入门却太难了!

近几年来&#xff0c;物联网发展迅速&#xff1a;据中商产业研究院《2016——2021年中国物联网产业市场研究报告》显示&#xff0c;预计到2020年&#xff0c;中国物联网的整体规模将达2.2万亿元&#xff0c;产业规模比互联网大30倍。我们可以看到&#xff0c;物联网的前景广阔。…

感知器算法的基本原理和步骤_很多情况下,深度学习算法和人脑相似

人脑模拟  深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。此观点引出了“神经网络”这一术语。人 脑中 包含 数 十亿个神经元&#xff0c;它 们 之间有 数 万个 连 接。很多情况下&#xff0c;深度学习算法和人脑相似&#xff0c;因为人脑和深度学习模型都拥有大量…

打印时候复选框勾选不见了_checkbox 选中未显示对号勾选的问题

今天同事 让帮忙调试一个checkbox只选中一个的方法&#xff0c;代码如下&#xff1a;ID平台代码平台名称选项2选项2选项3选项4varEleInput$("[name ptcode]:checkbox")//;$("#table_platform input") ;EleInput.each(function(index, element) {$(element…

工程师如何解决穿衣搭配烦恼?——滴搭平台与算法

摘要&#xff1a; 阿里工程师们推出了一个滴搭平台&#xff0c;基于千万时尚达人的优质搭配&#xff0c;已经学习出了一套比较成熟的算法&#xff0c;帮你找到最合适的穿搭。不信&#xff1f;下面一起来深入了解“滴搭”背后的算法。 作为一名工程师&#xff0c;每天与代码打交…

Linux下搭建 kafka集群 + zookeeper集群部署 安装、启动、停止

文章目录一、环境部署总览1. 软件版本选型2. 服务器软件部署总览二、软件部署手册2.1. JDK2.2. kafka2.3. Kafka Eagle2.4. mysql2.5. zookeeper2.6. maven三、kafka集群部署3.1. 启动zk集群3.2. 启动kafka集群3.3. 启动Kafka Eagle一、环境部署总览 1. 软件版本选型 软件版本…

刷爆了!GitHub标星1.6W,这个 Python 项目太实用!

GitHub上&#xff0c;一份用Python开发的12306 购票助手火了&#xff01;这个用 Python 开发的 12306 购票助手&#xff0c;已经有 1.6w star&#xff0c;作者也一直在维护。它实现了自动打码&#xff0c;自动登录&#xff0c;捡漏&#xff0c;候补等功能。用 Python 帮你抢票&…

flexcell控件 许可证信息没有找到_报表控件 ActiveReports 全面迎来 .Net Core 时代

报表控件ActiveReports全面迎来 .Net Core 时代&#xff01;一键创建 .Net Core MVC 项目近期&#xff0c;葡萄城报表控件ActiveReports V14.0 正式发布&#xff0c;全面支持 .NET Core平台。同时&#xff0c;在本次更新中 ActiveReports的桌面报表设计器UI得以全面增强&#x…

彻底卸载acer软件保护卡_宏碁(Acer)传奇 14英寸 新一代7nm六核处理器 真香机 高性能宏基笔记本电脑(R5-4500U 7纳米 16G 512GSSD )...

拜托朋友帮忙推荐的一款4k左右笔记本&#xff0c;要求:简单办公学习&#xff0c;看视频娱乐即可。然后朋友帮忙推荐了两款。一款是荣耀magic。另一款就是这款宏碁传奇预售款。京东标题如下:【宏碁&#xff08;Acer&#xff09;传奇 14英寸 新一代7nm六核处理器 真香机 高性能 轻…

图解集成学习中的梯度提升思想

摘要&#xff1a; 本文讲述集成学习中的梯度提升方法的思想&#xff0c;以简单算术及图片的形式展示整个过程&#xff0c;一看就懂&#xff01; 简介 机器学习&#xff08;ML&#xff09;中的一个关键步骤是选择适合数据的最佳算法&#xff0c;根据数据中的一些统计数据和可视…

AI助手智商测评Siri进步最大,无人驾驶打车服务已在美国试行

摘要&#xff1a; 万年老幺Google Assistant稳坐AI助手第一的位置&#xff0c;siri屈居老二可进步倒是不小&#xff01;无人驾驶打车已经成为现实&#xff0c;就问你敢坐不敢坐&#xff01;最接地气儿的CEO马斯克&#xff0c;变身快递员送货到家只为卖车......支付宝小程序也来…

Kafka 监控 Kafka Eagle 精简版本

文章目录一、Kafka Eagle 下载、编译流程1. Kafka Eagle下载2. 解压Kafka Eagle3. 进入解压的目录4. 编译项目5. 添加编译环境6. 运行脚本编译项目二、Kafka Eagle 正式配置流程2.1. 进入编译获得web目录2.2. 将编译后的tar解压到/app目录2.3. 在/app目录下面查看2.4. 配置文件…