有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在实时格式化Android EditText时避免堆栈溢出?

在我的Android应用程序中,我有一个EditText,用户可以在其中输入金额。当EditText失去焦点时,我使用NumberFormat将输入的金额格式化为货币区域设置,当用户单击EditText时,它再次获取原始字符串并输入(code here

这很好,但当用户输入金额时,它看起来并不漂亮。理想情况下,我希望EditText还显示以下内容(按重要性顺序):

  1. 金额左侧的货币符号
  2. 本地化的数千个分离器
  3. 仅当用户输入时才使用小数标记

然而,我遇到的第一个问题是,当我使用TextWatcher并实现下面的代码片段时,我会得到一个(多么适合这个网站)StackOverflowException,因为它会监视自己的更改

@Override
public void afterTextChanged(Editable s) {
    amount_field.setText("€" + s.toString());
}

所以我的问题是:如何实时格式化EditText?欢迎所有提示


共 (1) 个答案

  1. # 1 楼答案

    尝试以以下方式在OnFocusChangeListener上使用:

    <EDIT-TEXT>.setOnFocusChangeListener(new OnFocusChangeListener() {
    
        @Override
        public void onFocusChange(View arg0, boolean arg1) {
            if(!arg1){//it means focus is shifted
                amount_field.setText("€" + s.toString());
            }
    
        }
    });
    

    尝试这样做:

    String lastText="";
    @Override
    public void afterTextChanged(Editable s) {
        if(!lastText.equals(s.toString())){
           String str=s.toString();
           str = str.replaceAll("\\D+", "");
           Locale dutch = new Locale("nl", "NL");
           NumberFormat numberFormatDutch = NumberFormat.getCurrencyInstance(dutch);
           String formattedAmount = numberFormatDutch.format(new BigDecimal(str));
           formattedAmount ="€" + formattedAmount;
           lastText=formattedAmount;
           amount_test.setText(formattedAmount);
        }
    }