7

そのため、Android用のTextWatcherを実装しようとして、EditTextウィジェットのテキストを通貨形式の文字列に変換したいので、TextChangedListenerが複数回呼び出されたり、無限ループに入ったりするといういくつかの問題が発生しました。

これを回避するために私がしたことは、独自のカスタムTextWatcherを作成し、afterTextChangedイベントで次のようなことをしたことです。

public class CurrencyTextWatcher implements TextWatcher {
    private EditText et;

    public CurrencyTextWatcher(EditText editText) {
        et = editText;
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

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

    public void afterTextChanged(Editable s) {
        et.removeTextChangedListener(this);
        et.setText(myCurrencyString);
        et.addTextChangedListener(this);
    }
}

だから私の質問は、これを行うためのより良い方法はありますか?編集が行われる場所と結果のフォーマットされた文字列を保持するための1つのEditTextウィジェットが必要です。

また、このようなTextChangedListenerを削除してから追加することに関して、実際に他の問題がありますか?

前もって感謝します

4

2 に答える 2

5

editTextを更新するたびに(たとえば、set textを呼び出すことによって)afterTextChangedが呼び出されるため、afterTextChangedを使用するたびにsetTextを呼び出すことは控え、何かが実際に変更されている場合にのみ呼び出す必要があると思います。

このようなsth

if ( !myCurrencyString.equals(et.getText()))
{
    et.setText(myCurrencyString);
}
于 2011-07-18T07:44:29.893 に答える
2

フォローしてみてはいかがでしょうか。

private void resetAddTagField() {
    if (edtView != null && textWatcherListener != null) {
        edtView.removeTextChangedListener(textWatcherListener);
        edtView.setText(DEFAULT_TEXT);    

        edtView.addTextChangedListener(textWatcherListener);
    }
}

私が学んだこと:TextWatcherの力を過小評価しないでください:D:D

于 2017-07-19T12:14:58.177 に答える