android获取EditText内容,TextWatcher按条件触发

android获取EditText内容,TextWatcher按条件触发

背景:

最近在尝试用原生安卓实现仿element-ui表单校验功能,其中涉及到EditText组件内容的动态校验,初步实现功能后,发现重置按钮逻辑异常:
理想情况下,重置按钮触发后,会将所有内容清空,不会触发校验逻辑,观察当前重置逻辑(此处以活动名称为例):

java 复制代码
	private EditText activityName;
    private void handleResetEvent() {
    	// 点击重置按钮
        resetBtn.setOnClickListener(v -> {
            activityName.setText(null);
        });
    }
    private void setActivityNameEvent() {
   		// 活动名称添加内容改变后监听 触发校验活动名称
        activityName.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

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

            @Override
            public void afterTextChanged(Editable s) {
                verifyActivityName();
            }
        });
    }
	private void verifyActivityName() {
		if (StringUtils.isEmpty(activityNameValue)) {
            activityNameTip.setText("请输入活动名称");
            createVerifyPass = false;
        } else {
            if ((activityNameValue.length() < 3 || activityNameValue.length() > 5)) {
                activityNameTip.setText("长度在3到5个字符");
                createVerifyPass = false;
            } else {
                activityNameTip.setText(null);
            }
        }
	}

debug调试发现走activityName.setText(null);就会马上触发afterTextChanged,进而调用verifyActivityName(),是同步的方法调用,咱们的需求需要在手动修改EditText组件时能够触发校验,而点击重置按钮时EditText组件内容置空不触发校验。

解决方案:

考虑新增一个标识resetBtnClickFlag用来识别当前的动作是否为重置,如果为重置则不触发具体的提示校验:

java 复制代码
	private EditText activityName;
	private boolean resetBtnClickFlag = false;
    private void handleResetEvent() {
    	// 在重置按钮逻辑开始和结束分别设置重置标识开启和关闭
        resetBtn.setOnClickListener(v -> {
            resetBtnClickFlag = true;
            activityName.setText(null);
            selectArea = null;
            selectDate = null;
            selectTime = null;
            timelyDelivery.setChecked(false);
            onlineActivity.setChecked(false);
            pushActivity.setChecked(false);
            offlineActivity.setChecked(false);
            brandExposure.setChecked(false);
            onlineBrandSponsorship.setChecked(false);
            offlineFree.setChecked(false);
            eventFormat.setText(null);
            resetBtnClickFlag = false;
        });
    }
    // 在控制提示信息的具体方法补充重置标识逻辑
    private void verifyActivityName() {
        Editable activityNameValue = activityName.getText();
        if (!resetBtnClickFlag && StringUtils.isEmpty(activityNameValue)) {
            activityNameTip.setText("请输入活动名称");
            createVerifyPass = false;
        } else {
            if (!resetBtnClickFlag && (activityNameValue.length() < 3 || activityNameValue.length() > 5)) {
                activityNameTip.setText("长度在3到5个字符");
                createVerifyPass = false;
            } else {
                activityNameTip.setText(null);
            }
        }
    }

效果:

相关推荐
2501_916008892 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
独行soc3 小时前
2026年渗透测试面试题总结-20(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
常利兵3 小时前
2026年,Android开发已死?不,它正迎来黄金时代!
android
Risehuxyc3 小时前
备份三个PHP程序
android·开发语言·php
Doro再努力13 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
Daniel李华13 小时前
echarts使用案例
android·javascript·echarts
做人不要太理性14 小时前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
我命由我1234515 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
朗迹 - 张伟15 小时前
Tauri2 导出 Android 详细教程
android
lpruoyu16 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习