Android 自定义TextWatcher实现自动在输入之后加入单位

本文介绍了一种在Android开发中自定义TextWatcher的方法,用于在输入框中自动添加单位,同时确保光标正确定位及避免监听死循环。通过扩展TextWatcher,实现了对外部内容变化的通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近的开发中遇到一个需求:有很多输入内容,有些有单位,有些没有单位,需要在有单位的输入值后面加上单位,没单位的就不用管,因为有些没单位,所有UI说是专门设计一个显示单位的元素不统一,让自己想办法在输入框中加入单位就行了。于是就开干吧!

 

思路:

   1.要扩展原有的TextWatcher,在afterTextChanged中加入咱们的单位。

   2.自动填充单位后要将光标定位在咱们的单位前面。

   3.对外暴露一个方法通知外部内容变化了。

下面来看具体代码,注释写得比较详细,这里就不在一一介绍了,直接复制可用!


import android.text.Editable;
import android.text.Selection;
import android.text.TextWatcher;
import android.widget.EditText;

/**
 * date     :  2020/3/12.
 * description:自定义textwatcher,自动往后面/加东西
 */
public class MyTextWatcher implements TextWatcher {

    private String lastStr;//往后面加的单位
    private EditText editText;//editText对象,用作在咱们要向内容后面加上单位时先移除监听,避免死循环
    TextChangeListener listener;//对外提供的接口,通知外部我有内容变化

    public MyTextWatcher(String lastStr,EditText editText,TextChangeListener listener) {
        this.lastStr = lastStr;
        this.editText=editText;
        this.listener=listener;
    }

    @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) {
        if (s != null) {
            editText.removeTextChangedListener(this);//移除输入监听,避免陷入死循环

            if (s.toString().trim().equals(lastStr)) {
                //当此时内容是单位的时候,将edittext置为空
                editText.setText("");
            } else {
                //当前内容不是/不只是单位
                String ss=s.toString();
                
                //辅助判断单位存不存在/存在的位置
                int len=ss.length()-lastStr.length();
                if (len>0 && ss.substring(ss.length()-lastStr.length(),ss.length()).equals(lastStr)){
                    //如果单位就在最后,不需要做任何事情

                }else {
                    //当用户自己将光标置到单位后面时,输入的内容就会在单位后面,此时将前面的单位去掉,将单位放到最后
                    ss=ss.toString().replace(lastStr, "") + lastStr;
                    editText.setText(ss);
                }
                
                //此时就为咱们正常的内容了,检查如果需要向外通知,那么久通知外部
                if (listener!=null){
                    listener.onTextChange(ss);
                }
                
                //这里得到光标应该在的位置(单位前面)
                int index=ss.length()-lastStr.length();
                //设置光标的位置
                Selection.setSelection(editText.getText(),  index<0?0:index);
            }
            //前面将监听移除过来,这里需要重新进行监听
            editText.addTextChangedListener(this);
        }
    }

    /**
     * 对外通知的接口
     */
    public interface TextChangeListener{
        void onTextChange(String s);
    }
}

如有我没发现/考虑到的问题欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值