当用户在 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
中删除并水平使用一个 TextView
和 EditText
。这样你就可以摆脱美元符号
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);
}
}
}
}
});
}
我正在开发一个编辑文本将 $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
中删除并水平使用一个 TextView
和 EditText
。这样你就可以摆脱美元符号
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);
}
}
}
}
});
}