当用户在 edittext 中输入金额时,用金额替换 0 的最佳方法

Best approach to replace 0 with amount, when user enters an amount in edittext

我正在开发一个编辑文本将 $0 作为预定义文本的应用程序。 零是可编辑的。但是一旦用户输入 80 美元这样的金额,它就会显示 080 美元。 我正在使用 textwatcher 来删除 $ 并在打印值时替换它。

当用户输入金额时,如何实现 $80 的输出

预设值 - $0 输入 $80 后, 输出 = 080 美元 预计 = 80 美元

提前致谢。

   amountEdittext.setText("[=10=]");
    Selection.setSelection(amountEdittext.getText(), 
 amountEdittext.getText().length());
    amountEdittext.addTextChangedListener(new TextWatcher() {

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

        }

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

        @Override
        public void afterTextChanged(Editable s) {
            if (!s.toString().startsWith("$")) {
                amountEdittext.setText("$");
                Selection.setSelection(amountEdittext.getText(), amountEdittext.getText().length());

            }

        }
    });

你应该 HINT

而不是使用文本 属性
amountEdittext.setHint("[=10=]");

您将不再需要任何其他代码。 并将文本留空,然后您可以添加验证以检查空文本。

您可以使用 setOnFocusChangeListener()

更改具有焦点时的提示

使用 InputFilter 比使用 TextWatcher 更好。由于您有 $ 符号,最好将其从 EditText 中删除并水平使用一个 TextViewEditText。这样你就可以摆脱美元符号

class DecimalDigitsInputFilter(digitsBeforeZero: Int, digitsAfterZero: Int) : InputFilter {
private val mPattern: Pattern

init {
    mPattern =
        Pattern.compile("[0-9]{0," + (digitsBeforeZero ) + "}+((\.[0-9]{0," + (digitsAfterZero ) + "})?)||(\.)?")
}

override fun filter(
    source: CharSequence?,
    start: Int,
    end: Int,
    dest: Spanned?,
    dstart: Int,
    dend: Int
): CharSequence? {

    if (source != null && dest != null) {
        val replacement = source.subSequence(start, end).toString()
        val newVal = (dest.subSequence(0, dstart).toString() + replacement
                + dest.subSequence(dend, dest.length).toString())
        val matcher = mPattern.matcher(newVal)
        if (matcher.matches())
            return null

        return if (TextUtils.isEmpty(source))
            dest.subSequence(dstart, dend)
        else
            return ""
    }
    return ""
    }
}

我刚刚意识到你在做什么,Selection.setSelection 将光标移动到 edittext 中文本的末尾,这样就会在零之后。

所以,这是我认为可行的解决方案;

    amountEdittext.setText("[=10=]");
    amountEdittext.setOnFocusChange(View view, boolean b) {
        if (b && amountEdittext.getText().toString().matches("^\[=10=]$")) {
            amountEdittext.setText("$");
            Selection.setSelection(amountEdittext.getText(), amountEdittext.getText().length());
        } else {
            Selection.setSelection(amountEdittext.getText(), amountEdittext.getText().length());
        }
    }

这应该可以解决您的问题。

    amountEdittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void afterTextChanged(Editable editable) {
            if (editable.length() > 2) {
                for (int i = 0; i < editable.length() - 1; i++) {
                    if (editable.charAt(i) == '$' && editable.charAt(i + 1) == '0') {
                        editable.delete(i + 1, i + 2);
                    }
                }
            }
        }
    });
}