gpt4 book ai didi

android - 两个 TextWatcher 创建一个无限循环

转载 作者:搜寻专家 更新时间:2023-11-01 08:27:00 26 4
gpt4 key购买 nike

我的 Android 应用程序中有 3 个 EditText 字段,我试图让它们相互通信。它们是订单总额、收到的金额和小费。用户在第一个 EditText 中输入订单价格。另外两个 EditTexts 是我想要根据每个 EditTexts 的值修改的。如果用户在订单总额中输入 20.00,在收到的金额中输入 25.00,我希望小费显示 5.00。同样,如果他们在订单总额中输入 20.00,在小费中输入 5.00,我希望收到的金额显示 25.00。我的所有计算都是正确的,只要另一个被注释掉,我的每个 TextWatcher 就可以工作,但是对于它们两个,它只会创建一个无限循环。有没有好的方法可以做到这一点,或者有人可以为我指明正确的方向以获得一些有用的链接吗?我似乎找不到任何适合我正在尝试做的事情。

我的代码如下:

eTotalCost = (EditText) findViewById(R.id.orderTotal);
eAmountReceived = (EditText) findViewById(R.id.amountReceived);
eTip = (EditText) findViewById(R.id.tip);
eMileage = (EditText) findViewById(R.id.mileage);
eGrandTotal = (EditText) findViewById(R.id.grandTotal);

eAmountReceived.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){}

@Override
public void afterTextChanged(Editable s)
{
eAmountReceived = (EditText) findViewById(R.id.amountReceived);
eTotalCost = (EditText) findViewById(R.id.orderTotal);
eTip = (EditText) findViewById(R.id.tip);
eMileage = (EditText) findViewById(R.id.mileage);
eGrandTotal = (EditText) findViewById(R.id.grandTotal);

sAmountReceived = eAmountReceived.getText().toString();
sTotalCost = eTotalCost.getText().toString();
sMileage = eMileage.getText().toString();
sTip = eTip.getText().toString();

try
{
dAmountReceived = Double.parseDouble(sAmountReceived);
dTotalCost = Double.parseDouble(sTotalCost);

dSubtract = dAmountReceived - dTotalCost;
dMileage = Double.parseDouble(sMileage);
dGrandTotal = dSubtract + dMileage;
} catch(NumberFormatException e){}

sTip = String.valueOf(dSubtract);

DecimalFormat df = new DecimalFormat("0.00");
sTip = df.format(dSubtract);

eTip.setText(sTip);

sGrandTotal = String.valueOf(dGrandTotal);
sGrandTotal = df.format(dGrandTotal);
eGrandTotal.setText(sGrandTotal);
}
});


eTip.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){}

@Override
public void afterTextChanged(Editable s) {
eAmountReceived = (EditText) findViewById(R.id.amountReceived);
eTotalCost = (EditText) findViewById(R.id.orderTotal);
eTip = (EditText) findViewById(R.id.tip);
eMileage = (EditText) findViewById(R.id.mileage);
eGrandTotal = (EditText) findViewById(R.id.grandTotal);

sAmountReceived = eAmountReceived.getText().toString();
sTotalCost = eTotalCost.getText().toString();
sMileage = eMileage.getText().toString();
sTip = eTip.getText().toString();

try
{
dTip = Double.parseDouble(sTip);
dTotalCost = Double.parseDouble(sTotalCost);

dAdd = dTotalCost + dTip;
dMileage = Double.parseDouble(sMileage);
dGrandTotal = dTip + dMileage;
} catch (NumberFormatException e) {}

sAmountReceived = String.valueOf(dAdd);

DecimalFormat df = new DecimalFormat("0.00");
sAmountReceived = df.format(dAdd);

eAmountReceived.setText(sAmountReceived);

sGrandTotal = String.valueOf(dGrandTotal);
sGrandTotal = df.format(dGrandTotal);
eGrandTotal.setText(sGrandTotal);
}
});

最佳答案

您正在使用 afterTextChanged 回调循环 setText 方法

发生了什么:

您有 2 个 textWatcher:一个用于 eTip,一个用于 eAmountReceived

当您在任何这些字段上调用 ​​setText() 时,它将开始循环,因为 setText 将触发 afterTextChanged 并且在您调用的两个文本观察器中 setText() 用于相反的字段,这将再次触发 afterTextChanged

为了避免这种情况,引入一些 bool 标志,指示是否已为相应的 edittext 设置值,或者仅当新值与已设置的先前值不同时才调用 setText

关于android - 两个 TextWatcher 创建一个无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43947561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com