假设当一个字段被加载时,它是空的。当用户键入 1 时,它显示 0.01,然后他在 1 (10) 之后键入另一个 0,它变为 0.10。当他输入另一个 1 时,它变成了 1.10。
就像输入产品的价格一样。我如何在 Android 上做到这一点?老实说,我很难过,因为我从来没有尝试过这样的事情。有什么特殊的输入法吗?
假设当一个字段被加载时,它是空的。当用户键入 1 时,它显示 0.01,然后他在 1 (10) 之后键入另一个 0,它变为 0.10。当他输入另一个 1 时,它变成了 1.10。
就像输入产品的价格一样。我如何在 Android 上做到这一点?老实说,我很难过,因为我从来没有尝试过这样的事情。有什么特殊的输入法吗?
这是我为自己编写的代码:
private String addCurrencySign(String digits) {
String string = "£";
// Amount length greater than 2 means we need to add a decimal point
if (digits.length() > 2) {
String pound = digits.substring(0, digits.length() - 2); // Pound part
String pence = digits.substring(digits.length() - 2); // Pence part
string += pound + "." + pence;
} else if (digits.length() == 1) {
string += "0.0" + digits;
Log.d(TAG, "length 1 " + string);
} else if (digits.length() == 2) {
string += "0." + digits;
Log.d(TAG, "length 2 " + string);
}
return string;
}
addCurrencySign
每次用户尝试在数字键盘上键入时都会触发此方法。数字键盘由几个数字按钮组成(就像 POS 手持机或计算器一样)。
由于您不需要使用按钮构建小键盘,您是否可以尝试拦截键盘事件,这在处理键盘操作中进行了描述,并且可能编写如下内容:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_0:
return true;
case KeyEvent.KEYCODE_1:
return true;
case KeyEvent.KEYCODE_2:
return true;
case KeyEvent.KEYCODE_3:
return true;
......
default:
return super.onKeyUp(keyCode, event);
}
}
也许你不必使用 switch 子句,我的想法是拦截输入 0~9 位的密钥,并为每个 0~9 调用addCurrencySign
方法。
Use:
TextWatcher watcher = new TextWatcher(){
afterTextChanged(Editable s){}
beforeTextChanged(CharSequence s, int start, int count, int after){}
onTextChanged(CharSequence s, int start, int before, int count){}
}
yourEditText.addTextChangedListener(watcher);
Here you will find more info about TextWatcher http://developer.android.com/reference/android/text/TextWatcher.html
好的,伙计们..我有一个临时的解决方法。这不能被称为完美的解决方案,但它是一种在我的情况下效果很好的解决方法。
我想不出办法来阻止 stackoverflow 错误。我的解决方法?让 EditText 字段接受输入,但在 TextView 上显示货币输出,并使 EditText 从 UI 中消失,这样用户就看不到他只输入了 1234 而不是 12.34。
这是代码。addCurrencySign 函数来自@ss1271。
amountpaid.addTextChangedListener(new TextWatcher()
{
@Override public void onTextChanged(CharSequence s, int start, int before, int count)
{
amount.setText(addCurrencySign(s.toString()));
}
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override public void afterTextChanged(Editable s)
{
}
});
这是用户发布的功能。它工作得很好。
private String addCurrencySign(String digits)
{
String string = "&"; // Your currency
// Amount length greater than 2 means we need to add a decimal point
if (digits.length() > 2)
{
String pound = digits.substring(0, digits.length() - 2); // Pound
// part
String pence = digits.substring(digits.length() - 2); // Pence part
string += pound + "." + pence;
}
else if (digits.length() == 1)
{
string += "0.0" + digits;
Log.d("TextWatcher", "length 1 " + string);
}
else if (digits.length() == 2)
{
string += "0." + digits;
Log.d("TextWatcher", "length 2 " + string);
}
return string;
}
这是“不可见”的编辑文本:
<EditText
android:id="@+id/amoundpaid"
android:layout_width="1dp"
android:layout_height="1dp"
android:background="#00000000"
android:ems="10"
android:inputType="number"
android:textColor="#00ffffff" >
<requestFocus />
这是将显示输出文本的字段(带有货币符号和正确的小数点值):
<TextView
android:id="@+id/amount"
android:layout_width="210dp"
android:layout_height="50dp"
android:background="#80000000"
android:gravity="center|center_vertical"
android:textColor="#ffffff"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium" />
我知道这不是一个最佳解决方案,但它确实有效。我需要这个功能,这是我必须做的。如果有人可以修复 stackoverflow 错误,请发布,mods 将更改答案(一旦验证)。