1

我尝试在我的 Android 应用程序中向 EditText 对象(用户可以编辑的文本区域)添加事件句柄,以控制用户可以编辑的内容。假设我的 EditText 中有此文本:

   * Hello 
   * World
   * On You...

我将附加一个控制器,允许用户仅编辑Hello,WorldOn You,如果用户尝试编辑或删除*和 系统后的第一个空格*,系统将停止编辑。

在 Java SE 上,当用户尝试删除或替换部分文本然后停止编辑时,我可以使用Document.remove(int, int)获取事件。

android EditText 有类似的 API 吗?

我曾尝试使用TextWatcher,但据我所知这对我没有帮助,我知道方法public void onTextChanged(CharSequence s, int start, int before, int count)会给出一些关于用户删除的文本的注释,但这似乎不可靠。这让我没有办法让这件事停止使用的编辑。

编辑: 我可以使用 Spanner 来防止对部分文本进行编辑吗?作为只读扳手?

有人知道解决我问题的好方法吗?

4

1 回答 1

0

我想我最终找到了一个可行的解决方案,但必须更深入地尝试才能知道这是否存在一些错误或错误。

public abstract class TextListener implements InputFilter {

    public abstract CharSequence removeStr(CharSequence removeChars, int startPos);

    public abstract CharSequence insertStr(CharSequence newChars, int startPos);

    public abstract CharSequence updateStr(CharSequence oldChars, int startPos, CharSequence newChars);

    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        CharSequence returnStr = source;
        String curStr = dest.subSequence(dstart, dend).toString();
        String newStr = source.toString();
        int length = end - start;
        int dlength = dend - dstart;
        if (dlength > 0 && length == 0) {
            // Case: Remove chars, Simple
            returnStr = TextListener.this.removeStr(dest.subSequence(dstart, dend), dstart);
        } else if (length > 0 && dlength == 0) {
            // Case: Insert chars, Simple
            returnStr = TextListener.this.insertStr(source.subSequence(start, end), dstart);
        } else if (curStr.length() > newStr.length()) {
            // Case: Remove string or replace
            if (curStr.startsWith(newStr)) {
                // Case: Insert chars, by append
                returnStr = TextUtils.concat(curStr.subSequence(0, newStr.length()), TextListener.this.removeStr(curStr.subSequence(newStr.length(), curStr.length()), dstart + curStr.length()));
            } else {
                // Case Replace chars.
                returnStr = TextListener.this.updateStr(curStr, dstart, newStr);
            }
        } else if (curStr.length() < newStr.length()) {
            // Case: Append String or rrepace.
            if (newStr.startsWith(curStr)) {
                // Addend, Insert
                returnStr = TextUtils.concat(curStr, TextListener.this.insertStr(newStr.subSequence(curStr.length(), newStr.length()), dstart + curStr.length()));
            } else {
                returnStr = TextListener.this.updateStr(curStr, dstart, newStr);
            }
        } else {
            // No update os str...
        }

        // If the return value is same as the source values, return the source value.
        return TextUtils.equals(source, returnStr) ? source : returnStr;
    }
}

从这段代码中,我可以很容易地阻止通过查找在我尝试编辑的文本中选择部分文本进行编辑。

于 2012-09-12T13:08:57.823 回答