让“提交”按钮状态跟随edittext以及checkbox等的状态实时变化

Qt CheckBox的使用 方法一 1、首先拖动一个checkBox按钮放在界面上,然后就是需要,选择转到槽中的槽函数,如下,选择这个: 2、代码部分: void MyWidget::on_checkBox_stateChanged(int arg1) { //第一种 if(arg1 == 2) { qDebug()<<"表示被选中1"; } else if(arg1 == 0) { qDebug()<<"表示未被选中"; 阅读详情

       现在很多应用在对于提交按钮是否可以点击的判断都是随着用户输入的内容或者勾选的状态而变化的,应该很少有人会如果用户在界面上没有任何输入的时候就让其开始点击按钮吧。这样做首先是增加了用户无谓的操作。另外也是会增加很多的非空判断,实在是不划算。所以才会有这种 如果该输入的还没有输入,该选择的没有任何勾选,那么提交按钮就不点亮还处于不可点击状态这样的设计了。

         好,其实今天跟大家说的就是自己现在在用的一个对于这种状态判断与控制的工具类了。下面直接看代码。         

/**
 * Created by hexiaopang on 2016/11/4.
 * 一个监听 edittext,checkbox是否有输入和选中,然后改变“提交”按钮的可提交状态
 * 只需要将需要监控的控件例如EditText,CheckBox添加进来,再设置“提交”按钮即可
 */
public class SubmitControl {
    private List<View> listViews = null;//用于存储 组件的list集合
    private MyTextWatcher myWatcher = null;//edittext以及textview是否有输入的监听
    private MyOnCheckedChangedListener myCheckedListener;//checkbox的选中状态监听
    private TextView submitButton;//提交“按钮”
    private static SubmitControl myControl;

    /**
     * 获取 单例实例(懒汉式)
     */
    public static SubmitControl getInstance() {
        if(myControl == null){
            myControl = new SubmitControl();
        }
        return myControl;
    }

    /**
     * 初始化数据 这个是必须得首先调用的,否则会出现混乱错误
     */
    public void initConroller() {
        if (listViews == null) {
            listViews = new ArrayList<View>();
        } else {
            listViews.clear();
        }
        myWatcher = new MyTextWatcher();
        myCheckedListener = new MyOnCheckedChangedListener();
    }

    /**
     * 添加view组件(这个view可以是textview或者是edittext或者是checkbox了)
     */
    public void addView(View... views) {
        for (View viewTemp : views) {
            if (!listViews.contains(viewTemp)) {
                if(viewTemp instanceof CheckBox){
                    ((CheckBox)viewTemp).setOnCheckedChangeListener(myCheckedListener);
                }else if(viewTemp instanceof TextView){
                    ((TextView)viewTemp).addTextChangedListener(myWatcher);
                }
                listViews.add(viewTemp);
            }
        }
    }

    //将某个组件从监控状态中移除
    public void remove(View... views) {
        for (View view : views) {
            //如果list中有 要移除的元素的话
            if(listViews.contains(view)){
                if (view instanceof CheckBox) {
                    ((CheckBox) view).setOnCheckedChangeListener(null);
                }else if (view instanceof TextView) {
                    ((EditText) view).removeTextChangedListener(myWatcher);
                }
                listViews.remove(view);
            }
        }
    }

    /**
     * checkbox的监听
     */
    private class MyOnCheckedChangedListener implements OnCheckedChangeListener {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            changeSubmitStatus();
        }
    }

    /**
     * edittext的监听
     */
    private class MyTextWatcher implements TextWatcher {

        @Override
        public void afterTextChanged(Editable s) {
            changeSubmitStatus();
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

    }

    /**
     * 根据 各种组件状态的改变,来设置提交按钮是否可点击
     * 貌似避免不了遍历
     */
    private void changeSubmitStatus() {
        int count = 0;
        for (int i = 0; i < listViews.size(); i++) {
            if (listViews.get(i) instanceof CheckBox) {
                if (((CheckBox) listViews.get(i)).isChecked()) {
                    count++;
                } else {
                    break;
                }
            }else if (listViews.get(i) instanceof TextView) {
                if (!TextUtils.isEmpty(((TextView) listViews.get(i)).getText().toString())) {
                    count++;
                } else {
                    break;
                }
            }
        }
        if (submitButton == null) {
            throw new NullPointerException("你至少得调用setSubmitButton()方法设置一个提交按钮吧");
        }
        submitButton.setEnabled((count == listViews.size()));
    }

    /**
     * 设置提交按钮
     * 并且提交按钮的状态改变是通过 textview或者edittext或者checkbox的对应赋值方法调用时候才会改变
     */
    public void setSubmitButton(TextView button) {
        this.submitButton = button;
    }
}

         我们来看下这个类,上面声明的变量就不说了。注释写的很清楚了,哈哈哈。首先是initConroller了。这个方法就是初始化存放view的list集合,如果不为空我们进行清空,因为我们类是单例的,所以如果list不为null,那么一定是存放着上个页面的view,所以用的时候必须要进行清空了。同样监听也必须new出来。其次是addview方法了,其实是可以一次添加多个的,我们转化出来就是一个数组了。同样我们参数类型是view,因为我们对于要监听的任何控件基本都是继承自view了。而方法内部则是对于view进行了区分,我们这里就是对于textview(edittext也是继承自textview嘛)和checkbox加上监听了,然后添加入我们的view的集合。我们同时也提供了将view移除监听的方法就是remove方法了,这个或许会很少用到。但是万一有这样的业务需求呢。下面的两个内部类就是对于textview以及checkbox的监听的具体实现。我们可以看到在textview(当然更多的是Edittext)的监听的afterTextChanged方法以及checkbox的监听的onCheckedChanged方法中都调用了changeSubmitStatus方法了。这个方法大家也可以看到是在我们需要监控的控件的状态改变的时候会被调用的了。首先是一个变量count,然后是进行一次遍历, 如果遍历到的当前view是checkbox就看其是否是checked状态,是的话count+1,否的话直接break,没有必要继续循环下去,因为这就一定代表组件没有输入或者没有勾选嘛,我们的“提交按钮”是不可以点击的了。同样如果遍历到的是textview就看其是否为非空,是的话count+1,否的话也是直接break了,原因同上。在循环的最后我们拿这个count和存放view的list集合的元素个数进行比较,如果相等则是代表所有需要输入的或者勾选的都已经勾选和非空了。按钮便就enable可以点击了。当然如果“提交按钮”都没有设置,那就没法玩耍了。就直接给调用方抛出一个异常吧。哈哈,所以最后一个方法就是设置“提交按钮的了”。 

        代码就是这样子的。再说下调用了。例如下面这样子:

@Override
    public void setController() {
        super.setController();
        SubmitControl.getInstance().initConroller();
        SubmitControl.getInstance().addView(verifyEt);
        SubmitControl.getInstance().setSubmitButton(submitBtn);
    }
        其实有一点特别重要的是我们的这个setController方法一定要放在Activity的onResume方法里面。因为我们的类是单例的。好比在界面A有有一些设置,然后跳转到页面B,但是A未销毁,然后又返回了A,若此时不调用setController其实还是在监听B页面的按钮以及输入框等的状态了。当然了,我们一般都会有个BaseActivity就是基类,其实在基类里面写个方法setController,然后在基类的onResume里面调用就好了。

       以上如有问题,欢迎批评指正。有问题,也欢迎一起讨论大笑。


Android中Adapter中edittext,checkbox记住状态解决方案(二) Android中Adapter中edittext,checkbox记住状态解决方案(一) 在上篇文章解决了adapter中checkbox记住状态和edittext可编辑的问题,下面谈谈怎么解决记住edittext中的内容和保证在操作加、减按钮的时候,操作的edittext对象是没有错位的问题。 一、记住edittext中的内容 解决的思路和checkbox差不多,不过还是有些差别,ch 阅读详情

相关推荐

Android小课程2——TextView,ScrollView,EditText,Button注册点击事件方法(4),ProgressBar,CheckBox,RadioButton,SeekBar

Android小课程2——TextView,ScrollView,EditText,Button注册点击事件方法(4),ProgressBar进度条,CheckBox复选控件,RadioButton,SeekBar

m0_56294528的博客 1003

checkbox多项选择当前的position信息提交

选择多个item信息提价上去

zhiqiang_zhao 640

android中adapter与checkbox、editText冲突的解决方案

如有疑问,欢迎和我交流。博客地址http://blog.youkuaiyun.com/footballclub/article/details/43193847,

Android中Adapter中edittext,checkbox记住状态解决方案

Android中Adapter中edittext,checkbox记住状态解决方案(一) 转载地址:http://blog.youkuaiyun.com/footballclub/article/details/43123105 一、问题原因 我们都知道Android中的adapter的view是用了重用机制的,简单地说就是当屏幕中的item占满屏幕以后,我们滑动list

fancychendong的专栏 9188

Android 自定义view-仿新浪微博#话题#插入EditText

Android 自定义view-仿新浪微博#话题#插入EditText 博客地址http://blog.youkuaiyun.com/u014702653/article/details/52799715

Android #话题# @昵称 edittext textview 输入变色

Android #话题# @昵称 edittext textview 输入变色

如何利用VValidator实现实时表单验证?提升用户体验的秘诀

VValidator是一款为Kotlin和Android开发的简单易用的表单验证库,通过实时表单验证功能可以显著提升用户体验。本文将详细介绍如何使用VValidator实现实时表单验证,让你的应用表单交互更加流畅和专业。 ## 为什么实时表单验证至关重要? 实时表单验证能够在用户输入过程中立即提供反馈,避免用户在提交时才发现错误,从而减少用户 frustration并提高表单提交成功率。VVa

gitblog_00295的博客 407

安卓EditText输入框相关-D-左边图片的文本框当文字输入时改变图片模仿微博登录框.rar

D-左边图片的文本框,当文字输入时改变图片,模仿微博登录框.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

recyclerview 的item中包含 edittext,checkbox,button的点击事件相关处理,以及item的删除事件

近期在做一个收银系统,里面用到了遇见了,一些,checkbox的选中,滑动数据混乱,以及edittext的焦点失去 不能输入,按钮的加减但是显示 数据混乱等bug,仅以此文章 记录解决方案。首先,关于checkbox的选中事件是一个老生常谈的问题了,下面直接上解决方案:思路就是需要通过设置tag ,来确定选中的checkbox 是哪个checkbox .接着 需要设置,是否默认选中,在列表的数据类...

weixin_37166398的博客 2129

霍尔编码器 vs 磁编码器:如何为你的电机控制项目选择最佳传感器(附实战对比)

本文深入对比了霍尔编码器和磁编码器在电机控制项目中的应用,从技术原理、性能参数、成本效益到实际场景选择提供了全面分析。通过实验室测试和项目案例,帮助工程师根据精度、环境抗性和预算选择最佳传感器方案,特别适合机器人、伺服驱动等领域的开发者参考。

weixin_28312391的博客 350

5G NR LDPC码(2)—— 从基图到速率匹配:解码5G高速数据信道的标准化设计

本文深入解析了5G NR LDPC码的标准化设计流程。从作为核心骨架的基图(BG1/BG2)出发,详细阐述了其如何通过扩展因子Z灵活生成实际校验矩阵,并协同传输块大小计算与分段策略。文章重点剖析了基于循环缓存和冗余版本的速率匹配机制,以及其如何高效支撑增量冗余混合自动重传请求,从而确保5G高速数据信道在复杂环境下的可靠与高效传输。

weixin_29206669的博客 272

EditText以及checkBox简单例子

package com.example.edittext; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import andro

zjcheer_up的专栏 734

大模型运维实战:从GPU选型到推理服务稳定落地

大模型服务进入生产环境后,运维对象从传统进程转向GPU显存、KV Cache、推理吞吐等动态资源。显存利用率、首token延迟、并发队列深度等指标,直接影响模型服务的质量与成本。理解推理框架的内存分配机制、掌握监控告警与自动化扩容手段,是保障服务稳定的关键。这类能力广泛应用于企业私有化部署、智能客服、知识库问答等场景,帮助运维团队从被动救火转向主动容量规划与性能调优。本文围绕大模型运维的完整路线,梳理从硬件选型、推理部署到监控排障的实战经验,并算清一份真实项目的长期成本账。

weixin_29054245的博客 238

generative-ai-for-beginners 第21课:构建 Meta 家族模型应用——Llama 3.1 函数调用与 Llama 3.2 多模态实战

本文基于 generative-ai-for-beginners 课程第 21 课([阿拉伯语版文档](https://link.gitcode.com/i/660679c3239363f369ae8c5a18cdc4fa)、[英文版原文](https://link.gitcode.com/i/2ece429165f50b2f5c140dad23e2b315)),深入讲解如何用 Llama 3.1

gitblog_00027的博客 341

ArduPilot移植到自定义硬件:完整指南

详解如何将ArduPilot成功移植到自定义硬件平台,涵盖环境搭建、代码配置与调试技巧。无论是初学者还是进阶开发者,都能快速掌握ArduPilot在不同硬件上的适配方法,提升开发效率。

weixin_28931449的博客 637

Docker安装并运行AnythingLLM的详细教程

通过本文的介绍,你已经掌握了如何在 CentOS 系统上使用 Docker 安装并运行 AnythingLLM。AnythingLLM 提供了强大的功能,支持本地知识库搭建和多模态输入,非常适合个人和企业使用。希望本文能帮助你快速上手并搭建自己的 AI 知识库。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 5843

Android Studio中RadioButton和Checkbox选中和未选中图片的状态

Android Studio中RadioButton和Checkbox选中和未选中图片的状态

weixin_65399034的博客 692

置顶必读(1) |《滚雪球学SpringBoot 3.x》· 高质量专栏介绍,你值得拥有!

《滚雪球学SpringBoot 3.x》 并不是普通的技术讲解合集,它是专为开发者精心设计的系统化学习路径。通过不断“滚动学习”,我们将带领你从基础入门到高阶应用,从理解每一行代码到设计和优化大规模分布式系统,最终帮助你成长为一位精通 spring架构 的工程师。

**My Coding Family** 12万+

android checkbox文本框,【android】CheckBox控件之显示隐藏密码输入框的实现

在登陆账号的时候,如果细心可以注意到密码输入框下面有一个提示是否显示密码的小按钮。博主刚学完CheckBox控件相通过CheckBox实现这一功能。CheckBox功能主要是复选框的实现,结合EditText的setTransformationMethod()方法就可以实现着一功能.原理比较简单,还是直接看代码吧!!!首先,在Activity中新建xml文件代码如下:android:id="@+i...

weixin_29340419的博客 991

解决gradle下载慢的问题

allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。buildScript块的repositories主要是为了Gradle脚本自身的执行,获取脚本依赖插件。根级别的repositories主要是为了当前项目提供所需依赖包。慢的问题在于下载时链接的是官网,而官网下载速度太慢;1、解决gradle不同版本下载慢的问题。但是这个镜像站的版本不全,低版本可以用;有公司做的国内镜像站;

weixin_42551921的博客 2051

立项书8分钟定生死?手把手教你用ChatGPT辅助打造高水平申报书,让评审专家一看就想打高分!

宏大叙事、空话堆砌只会让评审绕晕,不如聚焦一个具体问题,拿出清晰的研究路径、扎实的设计方案,把“我想做什么、为什么做、打算怎么做”讲明白。对评审来说,关键不在你读了多少,而在你能否看清领域的共识、争议和空白,GPT的作用就在于帮你理清研究脉络,发现问题结构,聚焦那些还没被充分讨论的变量或方法,去提升综述的深度。之前要用到ProcessOn、Draw.io等工具画流程图,现在有了ai虽然方便了,但也需要多次调教,如果嫌麻烦,七哥给大家准备了课题申报常用的流程图,技术路线图,方便大家直接拿来编辑填空使用。

智能AI让学术科研更容易 290

android EditText显示隐藏密码

EditText显示(隐藏)密码 两种方式 第一种: TextInputLayout设置passwordToggleEnabled属性 <android.support.design.widget.TextInputLayout app:passwordToggleEnabled="true" android:layout_width="match_parent"...

Welcome 641

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

EditText显示隐藏密码

EditText显示(隐藏)密码 两种方式 第一种: TextInputLayout设置passwordToggleEnabled属性 <android.support.design.widget.TextInputLayout app:passwordToggleEnabled="true" android:layout_width

androidxm的博客 2628

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android开发从0开始(图形与按钮)

Android组件,图形与按钮

qq_48496633的博客 1859

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android --- 布局结构属性(三)

EditText 的特殊监听// 输入框的 Enter 按键监听 et.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { //action

RylynnKang 的博客 213

5.4 单选按钮和复选框

个人所用

a15925451988的博客 623
上一篇: replace和replaceAll的一点发现
下一篇: listview嵌套listview,子listview中有换行的textview展示有问题,肿么办?
和小胖
博客等级 码龄12年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值