多个EditText和TextView的监听,改变View的状态
本着让应用更加的方便,好用,快速原则,比如想让登录页,注册页中的edittext中的值符合条件的话,做一定的变化。
当你想要做出改变的时候,第一先百度下,看网上有没有类似的轮子,省的自己重复创造了,正所谓站在成功人的肩膀上,才会走的更高更远。
以下就是从网上找到的,参考博客
https://blog.csdn.net/duguodong2588/article/details/52503890
现在的轮子基本上都有了,主要看自己是否可以加以改造成自己想要的效果。
这个轮子很好用,思路也很好,但没有满足我的需求,我要在特定的editText上加上匹配规则,如果匹配通过的话就改变状态。
话不多说,直接上图看效果
改造思路
在改造的过程中,我首先想到的是用map集合来把editText和正则表达式组合到一块,后来感觉这样太笨重,于是想到了一个view控件都有setTag和getTag方法来组合到一块。
使用
//1.创建工具类对象 把要改变颜色的tv先传过去
WorkSizeCheckUtil.TextChangeListener textChangeListener = new WorkSizeCheckUtil.TextChangeListener(mBtnLogin);
//2.把所有要监听的edittext都添加进去
mEtPassword.setTag(WorkSizeCheckUtil.leastNum(6));
textChangeListener.addAllEditText(mEtMobile, mEtPassword);
//可以设置,也可以不设置,看自己的实际需求
//3.接口回调 在这里拿到boolean变量 根据isHasContent的值决定 tv 应该设置什么颜色
WorkSizeCheckUtil.setChangeListener(new WorkSizeCheckUtil.IEditTextChangeListener() {
@Override
public void textChange(boolean isHasContent) {
if (isHasContent) {
mBtnLogin.setBackgroundColor(Color.RED);
} else {
mBtnLogin.setBackgroundColor(Color.BLUE);
}
}
});
以下是我改造过的。
```
public class WorkSizeCheckUtil {
//常用的正则表达式,存放在这样,以满足登录,注册等页面的监听
public final static String LEAST_TWO = "^.{2,}$";
public final static String LEAST_SIX = "(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}";//字母+数字。最少6位的正则表达式
public static String leastNum(int number){
return "^.{" + number + ",}$";//最少number位
}
//回调监听,来改变具体的样式
public interface IEditTextChangeListener{
void textChange(boolean isHasContent);
}
//发布作品时候填写尺寸的监听器
static IEditTextChangeListener mChangeListener;
/**如果控件只是简单的开始和禁用的话,可以不用调这个监听*/
public static void setChangeListener(IEditTextChangeListener changeListener) {
mChangeListener = changeListener;
}
/**
* 检测输入框是否都输入了内容
* 从而改变按钮的是否可点击
* 以及输入框后面的X的可见性,X点击删除输入框的内容
*/
public static class TextChangeListener {
/**可以改变任何view*/
private View button;
private TextView[] editTexts;//其中getTag来获取String 是正则表达式的匹配规则
public TextChangeListener(View button){
this.button=button;
}
public TextChangeListener addAllEditText(TextView... editTexts){
this.editTexts=editTexts;
initEditListener();
return this;
}
private void initEditListener() {
Log.i("TAG", "调用了遍历editext的方法");
for (TextView editText:editTexts){
editText.addTextChangedListener(new TextChange());//添加监听
}
}
/**
* edit输入的变化来改变按钮的是否点击
*/
private class TextChange implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (checkAllEdit()){
button.setEnabled(true);
if (mChangeListener != null) {
mChangeListener.textChange(true);
}
Log.i("TAG", "所有edittext有值了");
}else {
button.setEnabled(false);
if (mChangeListener != null) {
mChangeListener.textChange(false);
}
Log.i("TAG", "有edittext没值了");
}
}
@Override
public void afterTextChanged(Editable editable) {}
}
/**
* 检查所有的edit是否输入了数据
* @return
*/
private boolean checkAllEdit() {
for (TextView editText:editTexts){
String editableStr = editText.getText().toString();
String patternStr = (String) editText.getTag();
if (!TextUtils.isEmpty(editableStr)){//不为空就继续
if (patternStr != null && !TextUtils.isEmpty(patternStr)){//规则不为空
Pattern p = Pattern.compile(patternStr);
Matcher m = p.matcher(editableStr);
//规则不为空就继续
if (!m.matches()) return false;//验证不通过就返回false
}
}else {//为空就返回false
return false;
}
}
return true;//如果都符合条件就返回true;
}
}
}
```
特点:
- 可以监听所有的view的子类的状态以及样式变化。
- 可以用TextView和EditText来做做监听。
- 使用正则表达式来做规则,应对所有的规则变化。
- 使用方便,代码简单
做好这个功能需要了解的知识点
- 正则表达式
- TextView与EditText的关系,
- View的setTag和getTag
- 系统监听器的使用和自定义回调机制