java - 实时格式化 Android EditText 时如何避免 StackOverflow?

标签 java android android-edittext stack-overflow

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

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

  1. 金额左侧的货币符号。
  2. 本地化的千位分隔符。
  3. 仅当用户输入时才显示小数点。

然而,我遇到的第一个问题是,当我使用 TextWatcher 并实现类似于下面的代码 fragment 的东西时,我得到了一个(非常适合这个网站的)StackOverflowException,因为它随后会观察自己的变化。

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

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

最佳答案

尝试按以下方式在 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);
    }
}

关于java - 实时格式化 Android EditText 时如何避免 StackOverflow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20419790/

相关文章:

java - 是否可以在不影响记录的情况下判断 java ResultSet 是否为空?

javascript - Webview 无法在 Oreo 上加载

Android EditText 值替换提示

java - import 语句中出现错误

java - 使用 JSP 表单仅从数据库返回部分数据

java - 从 Java 使用 ScriptEngine 调用自定义脚本函数

android - 将填充开始添加到 LinearLayout

android - GoogleSignInClient.signOut 崩溃并显示 : "Call connect() and wait for onConnected() to be called"

android - EditText 中的动态自动大写、自动更正或密码字段

android - 如何隐藏 EditText 的文本选择处理程序的 ActionPopupWindow