前言
没有前言的文章总感觉少了什么,该文章纯粹为了备份。
简介
多个输入框同时控制一个按钮控件的状态,为提高代码质量和代码的内聚程度,辅助工具油然而生。该工具的实现参考了一位博主的文章,文章连接找不到了,那就某某博主吧。再多的简介还不如一个效果图:
效果图
只输入一个时,按钮 enable = false
只有输入框都有内容时,按钮 enable = true
使用方法
为了避免EditText调用addTextChangedListener()而未注销监听导致内存泄露,辅助工具中添加了销毁的方法,在onDestroy中调用removeViews()方法进行移除监听。
1、首先声明对象
/**
* 按钮样式控制工具
*/
TextInputUtils nextHelper;
2、实例化对象
btnNext是被控制的控件
nextHelper = new TextInputUtils(btnNext);
3、添加控制控件
addViews(TextView... view)方法,参数为可变长度参数列表。当参数内的所有控件都满足条件时,被控制的控件的 enable = true.
nextHelper.addViews(etNumber, etCode);
4、释放控件
nextHelper.removeViews();
源码在此
package com.momin.baselib.util;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
* <p>Title: EditTextInputHelper</p>
* <p>Description: 编辑框输入监听控制</p>
* <p>Copyright: </p>
* <p>Company: </p>
*
* @author Momin
* @version 1.0
* @date 2020/9/25 16:03
*/
public class TextInputUtils implements TextWatcher {
/**
* 被操作对象
*/
private View targetView;
/**
* 监听集合
*/
private List<TextView> viewSet;
public TextInputUtils(View view) {
if (view == null) {
throw new IllegalArgumentException("The view is empty");
}
this.targetView = view;
}
/**
* 添加 EditText 监听
* @param views 传入单个或多个 TextView / EditText 对象
*/
public void addViews(TextView... views) {
if (views == null) {
return;
}
if (viewSet == null) {
viewSet = new ArrayList<>(views.length - 1);
}
for (TextView view : views) {
view.addTextChangedListener(this);
viewSet.add(view);
}
afterTextChanged(null);
}
/**
* 移除 TextWatcher 监听,避免内存泄漏
*/
public void removeViews() {
if (viewSet == null) {
return;
}
for (TextView view : viewSet) {
view.removeTextChangedListener(this);
}
viewSet.clear();
viewSet = null;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (viewSet == null) {
return;
}
for (TextView view : viewSet) {
if ("".equals(view.getText().toString())) {
setEnabled(false);
return;
}
}
setEnabled(true);
}
/**
* 设置View的事件
* @param enabled 启用或者禁用View的事件
*/
public void setEnabled(boolean enabled) {
if (enabled == targetView.isEnabled()) {
return;
}
if (enabled) {
//启用View的事件
targetView.setEnabled(true);
}else {
//禁用View的事件
targetView.setEnabled(false);
}
}
}