1

この問題があります。編集テキストに入力したときに表示をフォーマットするにはどうすればよいですか? たとえば、5 と入力すると、目的の通貨に合わせてフォーマットされます。onFocusChangeListenerで問題なくedittextのテキストをフォーマットできますが、クライアントにはonchangeが必要です。

ここにいくつかのコードがあります:

   <code>
    inputText = (EditText) findViewById(R.id.et_compare_rate_saving);
    inputText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)               {
            //System.out.println("beforeTextChanged::: => "+charSequence);
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            //System.out.println("onTextChanged::: => "+charSequence);
        }

        @Override
        public void afterTextChanged(Editable editable) {
            if(!editable.toString().isEmpty()){
                String amount = LO.removeSeparators(editable.toString(), getLocaleFormat());
                String newFormat = LO.compareRatesFormatting(Double.valueOf(amount),getLocaleFormat());
                System.out.println("afterTextChanged::: => "+newFormat);
                inputText.setText(newFormat);
            }
            //System.out.println("afterTextChanged::: => "+editable.toString());
        }
    });

   </code>

スタックオーバーフローエラーが発生しています

  <code>
    08-01 22:37:32.724: ERROR/AndroidRuntime(1566): FATAL EXCEPTION: main
    java.lang.StackOverflowError
    at android.view.View.addFocusables(View.java:4311)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:731)
    at android.view.ViewGroup.addFocusables(ViewGroup.java:712)
    at android.view.View.getFocusables(View.java:4269)
    at android.view.FocusFinder.findNextFocus(FocusFinder.java:114)
    at android.view.FocusFinder.findNextFocus(FocusFinder.java:98)
    at android.view.ViewGroup.focusSearch(ViewGroup.java:570)
    at android.view.ViewGroup.focusSearch(ViewGroup.java:572)
    at android.view.ViewGroup.focusSearch(ViewGroup.java:572)
    at android.view.ViewGroup.focusSearch(ViewGroup.java:572)
    at android.view.ViewGroup.focusSearch(ViewGroup.java:572)
    at android.view.ViewGroup.focusSearch(ViewGroup.java:572)
    at android.view.ViewGroup.focusSearch(ViewGroup.java:572)
    at android.view.View.focusSearch(View.java:4192)
    at android.widget.TextView.onCreateInputConnection(TextView.java:4936)
    at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:964)
    at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:919)

    </code>

何か案が?乾杯。どうもありがとう。

4

2 に答える 2

2

状況をもう少し明らかにするために、TextWatcher のドキュメントには、afterTextChangedでテキストを変更するときに注意する必要があることが明示的に記載されています。

public abstract void afterTextChanged (Editable s)

このメソッドは、s 内のどこかでテキストが変更されたことを通知するために呼び出されます。このコールバックから s をさらに変更することは正当ですが、変更を加えるとこのメソッドが再帰的に再度呼び出されるため、無限ループに陥らないように注意してください。(他の afterTextChanged() メソッドが既に他の変更を行ってオフセットを無効にしている可能性があるため、変更がどこで行われたかはわかりません。しかし、ここで知る必要がある場合は、onTextChanged で setSpan(Object, int, int, int) を使用できます。 (CharSequence, int, int, int) を使用して場所をマークし、ここからスパンが終了した場所を調べます。

于 2012-08-01T15:46:14.277 に答える
0

あなたは無限ループにあり、それがあなたがスタックオーバーフローを起こす理由です。テキストが変更されるたびに、afterTextChangedが呼び出されます。これにより、テキストが変更され、再度呼び出されます。

于 2012-08-01T15:05:45.417 に答える