You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin:如何禁止EditText连续输入4次相同字符

解决EditText禁止连续输入4次相同字符的问题

要实现允许输入最多3次连续相同字符、禁止第4次输入的功能,可以通过TextWatcher监听文本变化,在每次文本更新后检查并拦截违规输入。以下是具体实现方案:

核心思路

每次文本变更后,检查当前文本末尾是否存在连续4个相同字符:

  • 若存在,则截断最后一个字符,保留前3个相同字符;
  • 用标志位避免修改文本时触发TextWatcher的无限循环。

实现代码(直接使用TextWatcher)

在Activity或Fragment中给目标EditText添加监听:

private EditText mEditText;
// 标记是否正在手动更新文本,避免TextWatcher循环触发
private boolean mIsUpdating = false;
// 正则表达式:匹配末尾有连续4个相同字符的文本
private final Pattern mConsecutivePattern = Pattern.compile(".*(.)\\1{3}$");

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    mEditText = findViewById(R.id.edit_text);
    mEditText.addTextChangedListener(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) {
            if (mIsUpdating) {
                return;
            }
            
            String currentText = s.toString();
            Matcher matcher = mConsecutivePattern.matcher(currentText);
            
            // 检测到末尾有连续4个相同字符
            if (matcher.find()) {
                mIsUpdating = true;
                // 截断最后一个字符,保留合法内容
                String correctedText = currentText.substring(0, currentText.length() - 1);
                s.replace(0, s.length(), correctedText);
                // 将光标移到文本末尾
                mEditText.setSelection(correctedText.length());
                mIsUpdating = false;
            }
        }
    });
}

优化方案:自定义EditText(复用性更强)

如果多个页面需要这个功能,建议封装成自定义EditText,避免重复代码:

public class NoFourConsecutiveEditText extends androidx.appcompat.widget.AppCompatEditText {
    private boolean mIsUpdating = false;
    private final Pattern mConsecutivePattern = Pattern.compile(".*(.)\\1{3}$");

    public NoFourConsecutiveEditText(Context context) {
        super(context);
        initWatcher();
    }

    public NoFourConsecutiveEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initWatcher();
    }

    public NoFourConsecutiveEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initWatcher();
    }

    private void initWatcher() {
        addTextChangedListener(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) {
                if (mIsUpdating) return;
                
                String currentText = s.toString();
                Matcher matcher = mConsecutivePattern.matcher(currentText);
                
                if (matcher.find()) {
                    mIsUpdating = true;
                    String correctedText = currentText.substring(0, currentText.length() - 1);
                    s.replace(0, s.length(), correctedText);
                    setSelection(correctedText.length());
                    mIsUpdating = false;
                }
            }
        });
    }
}

使用时直接在布局文件中引用:

<com.yourpackage.NoFourConsecutiveEditText
    android:id="@+id/edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="输入内容,禁止连续4次相同字符"/>

关键细节说明

  1. 正则表达式逻辑:.*(.)\\1{3}$ 表示匹配任意字符开头,末尾有连续4个相同字符的文本,其中\\1引用第一个捕获组的字符,{3}表示重复3次,加上捕获组本身总共4次。
  2. 避免循环触发:mIsUpdating标志位确保手动修改文本时,不会再次触发afterTextChanged,防止无限循环。
  3. 覆盖所有场景:无论是手动输入、粘贴文本还是输入法联想输入,只要文本末尾出现连续4个相同字符,都会被拦截处理。

内容的提问来源于stack exchange,提问作者Umar Afzal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:44:56