我正在尝试创建一个简单的货币转换器,我正在使用Google的货币转换器对其进行建模,用户可以在一个字段中输入金额,应用程序将转换并显示相应字段中的金额。
为此,我决定使用onTextChanged
监听器,因为我希望它在用户输入金额时更新。
以下是一些代码剪辑,以绘制更清晰的图片。
private EditText Dollar,Euro;
private double Result;
private String Amount,Amount2;
Dollar=(EditText)findViewById(R.id.tbDollar);
Euro=(EditText)findViewById(R.id.tbEuro);
Dollar.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
try
{
Euro.setText(" ");
Amount=Dollar.getText().toString();
Result=0.92*Double.parseDouble(Amount);
Amount2 = String.format("%.2f", Result);
Euro.setText(Amount2);
}
catch (Exception e)
{
Euro.setText("0.00");
Log.e("Error","Unable to convert a blank Number");
}
}
此代码工作正常,直到我为Euro字段添加相同的代码,在添加应用程序时,只要崩溃任何数字。
我怀疑,例如,当一个数字插入到美元字段时,它会计算欧元并将其插入欧元字段,然后触发欧元的onTextchanged
监听器,计算美元和试验将它插入那里,几乎创建一个无限循环然后崩溃应用程序。
我确实认为解决方案是指定onTextChanged
侦听器只会从用户输入触发,但我无法找到有关该主题的任何内容。
为了感兴趣,包括欧元onTextChanged
监听器,如果这有任何区别,则在OnCreate方法中声明所有这些代码。
谢谢
public void onTextChanged(CharSequence s, int start, int before, int count)
{
try
{
Amount=Euro.getText().toString();
Result=1.09*Double.parseDouble(Amount);
Amount2 = String.format("%.2f", Result);
Dollar.setText(Amount2);
}
catch (Exception e)
{
Dollar.setText("0.00");
Log.e("Error","Unable to convert a blank Number");
}
}
答案 0 :(得分:1)
检查各自onTextChanged侦听器中编辑文本的焦点。如果编辑文本没有聚焦,只需在try catch块之前返回。
答案 1 :(得分:0)
我认为当第一个文本发生变化时,你应该删除另一个监听器。更改文本并重新添加监听器。
您可以使用: removeTextChangedListener(TextWatcher观察者)