使用两个onTextChanged Listerners(Android)

时间:2016-03-03 11:19:43

标签: java android textchanged

我正在尝试创建一个简单的货币转换器,我正在使用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");
                }
            }

2 个答案:

答案 0 :(得分:1)

检查各自onTextChanged侦听器中编辑文本的焦点。如果编辑文本没有聚焦,只需在try catch块之前返回。

答案 1 :(得分:0)

我认为当第一个文本发生变化时,你应该删除另一个监听器。更改文本并重新添加监听器。

您可以使用:     removeTextChangedListener(TextWatcher观察者)

http://developer.android.com/reference/android/widget/TextView.html#removeTextChangedListener(android.text.TextWatcher)