5

TextWatcherを使用して、押されたキーの値を変更します。私の目標は、入力中に一部の文字を置き換えることです。たとえば、キーを入力するときに「S」文字に達すると、「a」文字に置き換えられます。私の質問は:beforeTextChangedでそれを行うべきですか?どうやって?誰か私に例を教えてもらえますか?

4

4 に答える 4

11

この投稿は数年前のものであることを私は知っていますが、どちらのバージョンも私には機能せず、2つの答えのハイブリッドを構築しました。

@Override
public void afterTextChanged(Editable editable) {    
    if (editable.toString().contains(",")) {
       Editable ab = new SpannableStringBuilder(editable.toString().replace(",", ""));
       editable.replace(0, editable.length(), ab);
    }
}
于 2016-04-26T08:38:20.427 に答える
1

beforeTextChangedを使用すると、EditTextへのキーの実際の印刷が中断されないため、役に立ちません。私は次のようなものを使用します:

    public void afterTextChanged(Editable s) {
        if(s.length() > 0 && s.toString().charAt(s.length()-1) == 'S')
        {
            final String newText = s.toString().substring(0, s.length()-1) + "a"; 
            editText.setText(newText); 
        }
    }

いくつかのtoString()を追加しましたが、Editableがどのように機能するかは100%わかりませんが、それでカバーできると思います。

于 2013-03-27T07:36:44.560 に答える
1

で行う必要がありますが、無限のループを防ぐために、を取り外し再度取り付けるafterTextChangedことを忘れないでください。簡単な例を以下に示します。TextChangedListener

public void afterTextChanged(Editable s) {
        editText.removeTextChangedListener(this);
        //.. do changes here ..//
        editText.setText(newText);
        editText.addTextChangedListener(this);
}

ただし、を呼び出すと別の問題が発生しますsetText。これにより、カーソルがtextView内のテキストの最後に移動します。したがって、curserの新しい位置を自分で計算する必要があります。ユーザーは、テキストの選択した部分を貼り付けたり削除したりして、一度に複数の文字を入力できることに注意してください。
より完全な例を次に示します。このウォッチャークラスは、テキストのすべての非数値文字を削除します。

public class NumWatcher implements TextWatcher {
    private EditText editText;
    private int selPos;
    private String oldString, newString;
    public NumWatcher(EditText editText) {
        this.editText = editText;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        selPos = editText.getSelectionStart();
        oldString = myFilter(s.toString());
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        editText.removeTextChangedListener(this);
        newString = myFilter(s.toString());
        editText.setText(newString);
        int newPos = selPos + (newString.length() - oldString.length());
        if (newPos < 0) newPos = 0;
        editText.setSelection(newPos);
        editText.addTextChangedListener(this);
    }

    public String myFilter(String s) {
        String digits;
        digits = s.replaceAll("[^0-9]", "");
        if (s.equals("")) return "";
        return digits;
    }
}
于 2019-02-25T12:36:41.927 に答える
-2
@Override
public void afterTextChanged(Editable arg0) {
    Editable ab = new SpannableStringBuilder(arg0.toString().replace("S", "a"));
    arg0 = ab ;
}
于 2013-03-27T08:26:48.437 に答える