1

AndroidアプリのEditTextオブジェクト(ユーザーが編集できるテキスト領域)にイベントハンドルを追加して、ユーザーが編集できるものを制御しようとしています。EditTextにこのテキストがあるとします。

   * Hello 
   * World
   * On You...

Helloユーザーが、、、Worldまたはのみを編集できるようにするコントローラーを接続します。ユーザーOn Youが編集または削除しようとすると、システムが編集を停止した*後の最初のスペースが表示されます。*

Java SEでは、Document.remove(int、int)を使用してイベントを取得し、ユーザーがテキストの一部を削除または置換してから編集を停止しようとしています。

Android EditText用の同様のAPIはありますか?

私はTextWatcherを使用してみましたが、これが役に立たないことがわかっているので、メソッドpublic void onTextChanged(CharSequence s, int start, int before, int count)がどのテキストユーザーを削除するかについていくつかのメモを与えることは知っていますが、これは信頼できないようです。そして、これは私にこの問題が使用の編集を止める方法を与えません。

編集: テキストの一部に対して編集が行われないようにするためにスパナを使用できますか?読み取り専用スパナとして?

誰かが私の問題を解決する良い方法を知っていますか?

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 に答える