[英]InputFilter removes whole text
我輸入了 3 個字母字符 android 清除輸入。 我希望刪除最后一個,第三個字符,而不是全文
更新,刪除了關於下面評論的正則表達式,結果仍然相同
private final Integer mAlphabetCount = 2;
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String text = createResultString(source, start, end, dest, dstart, dend);
if (text.length() <= mAlphabetCount) {
for (int i = start; i < end; i++) {
if (!Character.isLetter((source.charAt(i)))) {
return "";
}
}
return null;
}
char[] digit = text.substring(2).toCharArray();
for (char c : digit) {
if (!Character.isDigit(c)) {
return "";
}
}
return source;
}
private String createResultString(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String sourceString = source.toString();
String destString = dest.toString();
return destString.substring(0, dstart) + sourceString.substring(start, end) + destString.substring(dend);
}
更新
首先,您需要決定在用戶輸入錯誤的情況下要發生什么。 例如,用戶已經輸入了“AB”,現在嘗試輸入“C”。 你想丟棄“C”嗎? 你想讓輸入字段變成“BC”嗎? 假設您想丟棄“C”。
檢查source
是否是Spanned
的實例。 如果是這樣,那么如果輸入無效,您不能只發回一個空字符串,否則它會刪除文本框(現在正在發生這種情況)。 您需要從source
提取正確的部分並將其發回。 由於我們決定只丟棄前 2 個字母之后的所有字母,因此您可以嘗試將source
與^([a-zA-Z]{0,2})(?:[^\\d]*)(\\d{0,7})
。 然后發回匹配組1+組2組成的結果,即前2個字母+前7位數字。
如果source
不是Spanned
的實例,您可以檢查 dest + source 是否匹配^[a-zA-Z]{0,2}\\d{0,7}$
。 如果是,則發回null
,否則丟棄輸入 - 發回空字符串。
這就是我所需要的,實際上不需要使用正則表達式,但它的工作方式相同。 答案參考
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source instanceof SpannableStringBuilder) {
SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder) source;
for (int i = end - 1; i >= start; i--) {
char currentChar = source.charAt(i);
if (i < mAlphabetCount) {
if (!Character.isLetter(currentChar)) {
sourceAsSpannableBuilder.delete(i, i + 1);
}
} else {
if (!Character.isDigit(currentChar)) {
sourceAsSpannableBuilder.delete(i, i + 1);
}
}
}
return source;
} else {
StringBuilder filteredStringBuilder = new StringBuilder();
for (int i = start; i < end; i++) {
char currentChar = source.charAt(i);
if (dest.length() < mAlphabetCount) {
if (Character.isLetter(currentChar)) {
filteredStringBuilder.append(currentChar);
}
} else {
if (Character.isDigit(currentChar)) {
filteredStringBuilder.append(currentChar);
}
}
}
return filteredStringBuilder.toString();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.