我已经实现了一个视图,其中EditText根据按下的按钮添加和删除。我也使用TextWatcher将数字更改为货币格式。一切正常,直到这里。
我的问题是当用户输入第一个EditText并按下添加按钮时。然后,当用户输入第二个EditText时,输入将使用第一个EditText字符串进行连接,并显示在第二个EditText中,并且第一个EditText也会连接在一起。所以基本上两个EditTexts都以相同的字符串结尾。 这是我的代码:
amount = new EditText(this);
RelativeLayout.LayoutParams etLParams = new RelativeLayout.LayoutParams(
400, LayoutParams.WRAP_CONTENT);
etLParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
amount.setInputType(InputType.TYPE_CLASS_NUMBER);
amount.setLayoutParams(etLParams);
amount.setId(AMOUNT);
amount.setSingleLine();
amount.requestFocus();
amount.setCursorVisible(true);
amount.setGravity(Gravity.RIGHT);
amount.addTextChangedListener(new TextWatcher(){
String price="";
private EditText newAmount = new EditText(DutchPayActivity.this);
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if(!s.toString().equals(price)){
String cleanString = s.toString().replaceAll("[$,.]", "");
long parsed = Long.parseLong(cleanString);
NumberFormat nf = NumberFormat.getInstance();
price = nf.format(parsed);
s.append(price); //gave me error:java.lang.NumberFormatException: 66666666666666666666666666666666
newAmount.setText(price); //same result as before..
newAmount.setSelection(price.length());
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
});
我已经尝试过onTextChanged()并实现了我的自定义类等等,但却无法让它工作。
答案 0 :(得分:1)
根据您的意见,问题很明显。
内部TexWatcher引用amount
,它始终是上次运行此代码时创建的EditText。两次运行此代码后,要创建两个EditTexts,要编辑其中任何一个,将触发编辑第二个EditText的TextWatcher。
解决方案:不要在TextWatcher中对amount
执行任何操作。使用提供的Editable。
或者,在TextWatcher的私有成员中复制amount
。
答案 1 :(得分:0)
我看不到你在哪里声明你的第二个EditText,但这行让我怀疑
amount.setId(AMOUNT);
为什么要为动态创建的组件设置Id?也可能是您设置的ID与现有ID冲突(可能是您的第二个EditText组件的ID?)
这个问题听起来像是你混淆了你的指针,你的监听器触发了正确的组件,但是你将“setText()”指向一个指向你认为不应该指向的组件的指针。
发现这个的最简单方法是使用调试器(eclipse附带),在afterTextChanged()侦听器上设置断点,并在断点触发时检查变量指向的位置。 更不用说您可以轻松地逐步完成文本设置过程。
祝你好运!