我有这个问题,如何在输入edittext时格式化它的显示?例如,如果我键入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>
知道吗?干杯非常感谢。
为了进一步了解这种情况,TextWatcher的文档明确指出,在afterTextChanged:中更改文本时应该小心
公共摘要void afterTextChanged(可编辑s)
调用此方法是为了通知您在s内,文本已更改。进一步从这个回调中更改为s,但要小心不要让自己进入一个无限循环,因为您所做的任何更改都会导致方法,以便再次递归调用(你没有被告知发生更改是因为其他afterTextChanged()方法可能已经进行了其他更改并使偏移无效。但如果你需要要知道这里,您可以在中使用setSpan(Object,int,int)onTextChanged(CharSequence,int,int)标记您的位置,然后从这里往上看跨度的尽头。
您处于一个无限循环中,这就是您获得stackoverflow的原因。每次文本更改时,都会调用afterTextChanged,这会更改文本并使其再次被调用