EditText报IndexOutOfBoundsException异常

本文介绍了一个关于EditText在Android中重复添加和移除文本变化监听器导致的IndexOutOfBoundsException异常问题及其解决方案。通过设置一个布尔型成员变量跟踪监听状态,确保监听器只被添加一次,避免了异常的发生。
摘要由CSDN通过智能技术生成

异常类似如下:

java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
at java.util.ArrayList.get(ArrayList.java:411)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8211) 
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10390)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1218)

这种情况很可能是由于EditText多次addTextChangedListener(…)之后,又调用removeTextChangeListener(…)造成的。
说说我的应用场景:
有一个输入框E,需要监听这个输入框E,当发现输入框E的内容改变之后,做了一下操作之后,就不再监听该输入框E了,防止做一些无用功,耗费资源,当点击按钮B搜索之后,又要重新监听这个输入框E,当内容发生改变,再及时作出响应,如此反复进行。
而造成异常的原因,正是因为添加了两次监听,重现步骤:
初始化EditText的时候,监听一次,此时没有输入任何内容,点击搜索按钮,又监听了一次,此时如果改变EditText内容,调用removeTextChangeListener(…),即发生闪退。

所以,在点击搜索之后,我们要判断该EditText是否已经有监听了,没有监听才进行添加。我们使用一个成员变量来记住EditText是否被监听,类似如下代码:

// 输入框是否还有监听者
private boolean hasListener;

初始化:

mSearchWatcher = 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) {
                removeTextChangeListener();
                resetSearch();
            }
        };

        addTextChangeListener();
/**
     * 监听搜索框
     */
    private void addTextChangeListener() {
        if (et_search != null && mSearchWatcher != null && !hasListener) {
            et_search.addTextChangedListener(mSearchWatcher);
            hasListener = true;
        }
    }

    /**
     * 不再监听搜索框
     */
    private void removeTextChangeListener() {
        if (et_search != null && mSearchWatcher != null && hasListener) {
            et_search.removeTextChangedListener(mSearchWatcher);
            hasListener = false;
        }
    }

onClick()方法里,点击“搜索”按钮之后,恢复监听:

// 点击搜索,恢复监听
addTextChangeListener();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值