Android,EditText事件,防止文本的某些部分可以删除/更改

时间:2012-09-11 19:51:35

标签: android events android-edittext

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

   * Hello 
   * World
   * On You...

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

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

Android EditText是否有类似的API?

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

修改 我是否可以使用扳手来阻止编辑文本的一部分?作为一个只读扳手?

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

1 个答案:

答案 0 :(得分: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;
    }
}

从这段代码中我可以轻松地防止在我尝试编辑的文本中通过查找选择部分文本进行编辑。