原标题:Android多个EditText输入效果解决方案
在开发中,我们常常遇到这种情况
我们往往需要的是下面这种效果
但是如果把这些实现的代码写在Activity中会比较麻烦,影响代码美观
于是就有了下面这个辅助类,禁用了按钮的点击事件和按钮的渐变色,可同时添加一个或者多个EditText
/**
* 文本输入辅助类,通过管理多个TextView或者EditText输入是否为空来启用或者禁用按钮的点击事件
*/
publicfinalclassTextInputHelperimplementsTextWatcher{
privateView mMainView; //操作按钮的View
privateList mViewSet; //TextView集合,子类也可以(EditText、TextView、Button)
privatebooleanisAlpha; //是否设置透明度
publicTextInputHelper(View view){
this(view, true);
}
/**
* 构造函数
*
* @paramview 跟随EditText或者TextView输入为空来判断启动或者禁用这个View
* @paramalpha 是否需要设置透明度
*/
publicTextInputHelper(View view, booleanalpha){
if(view == null) thrownewIllegalArgumentException( "The view is empty");
mMainView = view;
isAlpha = alpha;
}
/**
* 添加EditText或者TextView监听
*
* @paramviews 传入单个或者多个EditText或者TextView对象
*/
publicvoidaddViews(TextView... views){
if(views == null) return;
if(mViewSet == null) {
mViewSet = newArrayList<>(views.length - 1);
}
for(TextView view : views) {
view.addTextChangedListener( this);
mViewSet.add(view);
}
afterTextChanged( null);
}
/**
* 移除EditText监听,避免内存泄露
*/
publicvoidremoveViews(){
if(mViewSet == null) return;
for(TextView view : mViewSet) {
view.removeTextChangedListener( this);
}
mViewSet.clear();
mViewSet = null;
}
// TextWatcher
@Override
publicvoidbeforeTextChanged(CharSequence s, intstart, intcount, intafter){}
@Override
publicvoidonTextChanged(CharSequence s, intstart, intbefore, intcount){}
@Override
publicsynchronizedvoidafterTextChanged(Editable s){
if(mViewSet == null) return;
for(TextView view : mViewSet) {
if( "".equals(view.getText().toString())) {
setEnabled( false);
return;
}
}
setEnabled( true);
}
/**
* 设置View的事件
*
* @paramenabled 启用或者禁用View的事件
*/
publicvoidsetEnabled(booleanenabled){
if(enabled == mMainView.isEnabled()) return;
if(enabled) {
//启用View的事件
mMainView.setEnabled( true);
if(isAlpha) {
//设置不透明
mMainView.setAlpha( 1f);
}
} else{
//禁用View的事件
mMainView.setEnabled( false);
if(isAlpha) {
//设置半透明
mMainView.setAlpha( 0.5f);
}
}
}
}
在Activity创建时添加监听
privateTextInputHelper mInputHelper;
@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//创建一个辅助类,传入按钮操作View
mInputHelper = newTextInputHelper(mButton);
mInputHelper.addViews(mEditText1, mEditText2, mEditText3);
}
在Activity销毁时移除监听(避免内存泄露)
@Override
protectedvoidonDestroy(){
super.onDestroy();
//移除引用,避免内存泄露
mInputHelper.removeViews();
}
需要注意的是这里不单单只是可以添加EditText,还可以添加TextView,因为EditText是TextView的子类,最后要是觉得好用记得点个赞。
责任编辑: