android获取EditText内容,TextWatcher按条件触发
android获取EditText内容,TextWatcher按条件触发
- 背景:
- 解决方案:
- 效果:
背景:
最近在尝试用原生安卓实现仿element-ui表单校验功能,其中涉及到EditText组件内容的动态校验,初步实现功能后,发现重置按钮逻辑异常:
理想情况下,重置按钮触发后,会将所有内容清空,不会触发校验逻辑,观察当前重置逻辑(此处以活动名称为例):
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
用来识别当前的动作是否为重置,如果为重置则不触发具体的提示校验:
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);
}
}
}