Android-辅助工具-输入框控制控件状态

971 阅读2分钟

前言

​ 没有前言的文章总感觉少了什么,该文章纯粹为了备份。

简介

​ 多个输入框同时控制一个按钮控件的状态,为提高代码质量和代码的内聚程度,辅助工具油然而生。该工具的实现参考了一位博主的文章,文章连接找不到了,那就某某博主吧。再多的简介还不如一个效果图:

效果图

只输入一个时,按钮 enable = false

输入框控制控件状态_0.jpg

只有输入框都有内容时,按钮 enable = true

输入框控制控件状态_1.jpg

使用方法

为了避免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);
        }
    }
}