当其他 Edittext 改变时更新 Edittext
Update Edittext when other Edittext change
我正在尝试根据其他 EditTexts
更新单个 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();
}
});
}
这是 运行 控制台中的错误屏幕:
它重复了很长时间以致于错误的开头被截断了。这是应用程序的外观:
你检查值是否为空是不正确的。
- 将
boolean[] hasValue = {false}
替换为 boolean hasValue = true
。
- 而不是这个,
for (final Double db : values) {
hasValue[0] = db != null;
}
使用这个:
for (final Double db : values) {
if (db == null) {
hasValue = false;
break;
}
}
这是因为在原始版本中,您将 hasValue 编辑为仅依赖于 values 的最后一个元素。
此外,在 total = ...
行中,您使用了 values.get(0)-values.get(0)
。这引起了我的好奇。
您的问题是,您还将 total
添加到您的列表中。这就是为什么 total 也得到 Listener 的原因。
在它自己的 Listener 中设置 EditText 的文本会创建无限循环。
删除此行
editTexts.add(Total); // editTexts[8]
我正在尝试根据其他 EditTexts
更新单个 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();
}
});
}
这是 运行 控制台中的错误屏幕:
它重复了很长时间以致于错误的开头被截断了。这是应用程序的外观:
你检查值是否为空是不正确的。
- 将
boolean[] hasValue = {false}
替换为boolean hasValue = true
。 - 而不是这个,
for (final Double db : values) {
hasValue[0] = db != null;
}
使用这个:
for (final Double db : values) {
if (db == null) {
hasValue = false;
break;
}
}
这是因为在原始版本中,您将 hasValue 编辑为仅依赖于 values 的最后一个元素。
此外,在 total = ...
行中,您使用了 values.get(0)-values.get(0)
。这引起了我的好奇。
您的问题是,您还将 total
添加到您的列表中。这就是为什么 total 也得到 Listener 的原因。
在它自己的 Listener 中设置 EditText 的文本会创建无限循环。
删除此行
editTexts.add(Total); // editTexts[8]