簡體   English   中英

InputFilter 刪除整個文本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM