Android 当其他Edittext更改时更新Edittext

Android 当其他Edittext更改时更新Edittext,android,android-edittext,Android,Android Edittext,我正在尝试根据其他EditText更新单个EditText。出于某种原因,在我必须设置文本之前,一切正常,然后我会得到一个连续的错误列表。我似乎不知道为什么或者这是否是最佳实践。任何帮助都将不胜感激。如果我把文本的设置注释掉。我的应用程序运行良好。这是我的代码: final Boolean[] hasValue = {false}; ArrayList<EditText> editTexts = new ArrayList<>(); // Container l

我正在尝试根据其他
EditText
更新单个
EditText
。出于某种原因,在我必须设置文本之前,一切正常,然后我会得到一个连续的错误列表。我似乎不知道为什么或者这是否是最佳实践。任何帮助都将不胜感激。如果我把文本的设置注释掉。我的应用程序运行良好。这是我的代码:

 final Boolean[] hasValue = {false};
    ArrayList<EditText> editTexts = new ArrayList<>(); // Container list
    ArrayList<Double> values = new ArrayList<>(); // value list
    editTexts.add(IBalance); // editTexts[0]
    editTexts.add(Trading); // editTexts[1]
    editTexts.add(Binary); // editTexts[2]
    editTexts.add(Referrals); // editTexts[3]
    editTexts.add(Leader1); // editTexts[4]
    editTexts.add(Leader2); // editTexts[5]
    editTexts.add(Deposit); // editTexts[6]
    editTexts.add(Withdrawal); // editTexts[7]
    editTexts.add(Total); // editTexts[8]

    for (final EditText editText : editTexts) { //need to be final for custom behaviors
        editText.addTextChangedListener(new TextWatcher() {

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                /*if (editText.getText().toString().equals("0")) {
                    editText.setText("");

                }*/
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (editText.getText().toString().equals("") || editText.getText().toString().equals("0")) {
                    editText.setText("0.0");
                    editText.setSelection(editText.getText().length());
                }
                else if(editText.getText().toString().equals("0.0"))
                    editText.setSelection(editText.getText().length());
            }

            @Override
            public void afterTextChanged(Editable s) {
                values.add(Double.parseDouble(IBalance.getText().toString())); //[0]
                values.add(Double.parseDouble(Trading.getText().toString())); //[1]
                values.add(Double.parseDouble(Binary.getText().toString())); //[2]
                values.add(Double.parseDouble(Referrals.getText().toString())); //[3]
                values.add(Double.parseDouble(Leader1.getText().toString())); //[4]
                values.add(Double.parseDouble(Leader2.getText().toString())); //[5]
                values.add(Double.parseDouble(Deposit.getText().toString())); //[6]
                values.add(Double.parseDouble(Withdrawal.getText().toString())); //[7]
                for (final Double db : values) {
                    hasValue[0] = db != null;
                }
                double total = 0;
                if(hasValue[0]=true)
                {
                    total = values.get(0)+values.get(1)+values.get(2)+values.get(3)+values.get(4)+values.get(5)+values.get(6)-values.get(0);
//ERROR OCCURS      Total.setText(String.valueOf(total)); //ERROR OCCURS
                }
                values.clear();
            }
        });
    }
final Boolean[]hasValue={false};
ArrayList EditText=新建ArrayList();//集装箱清单
ArrayList值=新建ArrayList();//价值清单
编辑文本。添加(iLance);//编辑文本[0]
编辑文本。添加(交易);//编辑文本[1]
editText.add(二进制);//编辑文本[2]
编辑文本。添加(推荐);//编辑文本[3]
编辑文本。添加(领导1);//编辑文本[4]
编辑文本。添加(领导2);//编辑文本[5]
编辑文本。添加(存款);//编辑文本[6]
编辑文本。添加(撤回);//编辑文本[7]
编辑文本。添加(总计);//编辑文本[8]
对于(final-EditText-EditText:EditText){//对于自定义行为需要是final
editText.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
/*如果(editText.getText().toString().equals(“0”)){
editText.setText(“”);
}*/
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
如果(editText.getText().toString().equals(“”| | editText.getText().toString().equals(“”)0){
editText.setText(“0.0”);
editText.setSelection(editText.getText().length());
}
else if(editText.getText().toString().equals(“0.0”))
editText.setSelection(editText.getText().length());
}
@凌驾
公共无效后文本已更改(可编辑){
values.add(Double.parseDouble(IBalance.getText().toString());//[0]
values.add(Double.parseDouble(Trading.getText().toString());//[1]
values.add(Double.parseDouble(Binary.getText().toString());//[2]
values.add(Double.parseDouble(referels.getText().toString());//[3]
values.add(Double.parseDouble(Leader1.getText().toString());//[4]
values.add(Double.parseDouble(Leader2.getText().toString());//[5]
values.add(Double.parseDouble(Deposit.getText().toString());//[6]
values.add(Double.parseDouble(drawing.getText().toString());//[7]
用于(最终双db:值){
hasValue[0]=db!=null;
}
双倍合计=0;
if(hasValue[0]=true)
{
总计=值。获取(0)+值。获取(1)+值。获取(2)+值。获取(3)+值。获取(4)+值。获取(5)+值。获取(6)-值。获取(0);
//发生错误Total.setText(String.valueOf(Total));//发生错误
}
value.clear();
}
});
}
这是运行控制台中的错误屏幕:

它重复了很长时间,以至于错误的开始被切断。这就是应用程序的外观:


检查值是否为空是不正确的

  • boolean[]hasValue={false}
    替换为
    boolean hasValue=true
  • 而不是这个,
  • 使用以下命令:

    for (final Double db : values) {
        if (db == null) {
            hasValue = false;
            break;
        }
    }
    
    这是因为在最初的一个中,您将hasValue编辑为仅依赖于值的最后一个元素


    另外,在
    total=…
    行中,您使用了
    values.get(0)-values.get(0)
    。这引起了我的好奇心。

    您检查值是否为空是不正确的

  • boolean[]hasValue={false}
    替换为
    boolean hasValue=true
  • 而不是这个,
  • 使用以下命令:

    for (final Double db : values) {
        if (db == null) {
            hasValue = false;
            break;
        }
    }
    
    这是因为在最初的一个中,您将hasValue编辑为仅依赖于值的最后一个元素


    另外,在
    total=…
    行中,您使用了
    values.get(0)-values.get(0)
    。这引起了我的好奇心。

    您的问题是,您还将
    总计
    添加到您的列表中。这就是为什么道达尔也能得到听众

    在自己的侦听器中设置EditText的文本会创建一个无休止的循环

    删除此行

    editTexts.add(Total); // editTexts[8]
    

    您的问题是,您还将
    total
    添加到列表中。这就是为什么道达尔也能得到听众

    在自己的侦听器中设置EditText的文本会创建一个无休止的循环

    删除此行

    editTexts.add(Total); // editTexts[8]
    

    Total
    是您的
    for
    循环的一部分,您正在
    posterextchanged
    中设置
    Total
    ,因此您的循环永远不会结束。尝试删除编辑文本。添加(总计)
    Total
    是您的
    for
    循环的一部分,您正在
    posterextchanged
    中设置
    Total
    ,因此您的循环永远不会结束。尝试删除编辑文本。添加(总计)这绝对正确,但不是显示错误的原因谢谢您的建议并在我的计算中发现错误!这是绝对正确的,但不是显示错误的原因谢谢你的建议,并在我的计算中发现了错误!