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{3}$表示匹配任意字符开头,末尾有连续4个相同字符的文本,其中\\1引用第一个捕获组的字符,{3}表示重复3次,加上捕获组本身总共4次。 - 避免循环触发:
mIsUpdating标志位确保手动修改文本时,不会再次触发afterTextChanged,防止无限循环。 - 覆盖所有场景:无论是手动输入、粘贴文本还是输入法联想输入,只要文本末尾出现连续4个相同字符,都会被拦截处理。
内容的提问来源于stack exchange,提问作者Umar Afzal
相关产品推荐
相关产品推荐

