Java 当EditText值以编程方式而不是手动更改时,请删除addTextChangedListener()
我在一个网站上工作,在那里,我使用Java 当EditText值以编程方式而不是手动更改时,请删除addTextChangedListener(),java,android,android-edittext,listener,Java,Android,Android Edittext,Listener,我在一个网站上工作,在那里,我使用Javascript更改文本 当用户更改数量时,我正在更改总价和销售价格值 当用户更改销售价格时,我正在更改折扣值 当用户更改折扣时,我正在更改销售价格值 现在,我想在我的android应用程序中实现同样的功能 我在每个EditText上都添加了文本更改事件侦听器 像 对于数量编辑文本 holder.inputSaleQuantity.addTextChangedListener(new TextWatcher() { @Overrid
Javascript
更改文本
EditText
上都添加了文本更改事件侦听器
像
对于数量编辑文本
holder.inputSaleQuantity.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
});
用于折扣编辑文本。
holder.inputSaleDiscount.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
Log.d("SocialCodia", "afterTextChanged: inputSaleDiscount Event Listener Called");
int input = 0;
if (editable.toString().trim().length() > 0) {
input = Integer.parseInt(editable.toString().trim());
}
discountInputEvent(holder, input);
}
});
holder.inputSalePrice.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
priceEvent(holder);
Log.d("SocialCodia", "afterTextChanged: inputSalePrice Event Listener Called");
}
});
销售价格编辑文本。
holder.inputSaleDiscount.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
Log.d("SocialCodia", "afterTextChanged: inputSaleDiscount Event Listener Called");
int input = 0;
if (editable.toString().trim().length() > 0) {
input = Integer.parseInt(editable.toString().trim());
}
discountInputEvent(holder, input);
}
});
holder.inputSalePrice.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
priceEvent(holder);
Log.d("SocialCodia", "afterTextChanged: inputSalePrice Event Listener Called");
}
});
为什么要一次又一次地执行方法。
holder.inputSaleDiscount.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
Log.d("SocialCodia", "afterTextChanged: inputSaleDiscount Event Listener Called");
int input = 0;
if (editable.toString().trim().length() > 0) {
input = Integer.parseInt(editable.toString().trim());
}
discountInputEvent(holder, input);
}
});
holder.inputSalePrice.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
priceEvent(holder);
Log.d("SocialCodia", "afterTextChanged: inputSalePrice Event Listener Called");
}
});
当我更改任何EditText的值时,如
数量编辑文本的值,其调用销售价格编辑文本更改
听众也是
因为在数量价值改变时,我改变了售价
价值因此,当卖出价格变化时,文本会发生变化
执行
我正在调用的方法
private void priceEvent(ViewHolder holder) {
int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
int discount = percentage(sellPrice, totalPrice);
holder.inputSaleDiscount.setText(String.valueOf(discount));
}
private void discountInputEvent(ViewHolder holder, int input) {
int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int price = percentageDec(totalPrice, input);
holder.inputSalePrice.setText(String.valueOf(price));
}
private int percentage(int partialValue, int totalValue) {
Double partial = (double) partialValue;
Double total = (double) totalValue;
Double per = (100 * partial) / total;
Double p = 100 - per;
return p.intValue();
}
private int percentageDec(int totalValue, int per) {
if (per == 0 || String.valueOf(per).length() < 0)
return totalValue;
else {
Double total = (double) totalValue;
Double perc = (double) per;
Double price = (total - ((perc / 100) * total));
Integer p = price.intValue();
return p;
}
}
private void priceEvent(视图持有者){
int totalPrice=Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int sellPrice=Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
整数折扣=百分比(售价、总价);
holder.inputSaleDiscount.setText(String.valueOf(折扣));
}
私有无效折扣输入事件(视图持有者,整数输入){
int totalPrice=Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int价格=百分比DEC(总价格,输入);
holder.inputSalePrice.setText(String.valueOf(price));
}
私有整数百分比(整数部分值、整数总值){
双部分=(双)部分值;
双倍合计=(双倍)合计值;
双倍每=(100*部分)/总计;
双倍p=100-per;
返回p.intValue();
}
私有int percentageDec(int totalValue,int per){
if(per==0 | | String.valueOf(per.length()<0)
返回总值;
否则{
双倍合计=(双倍)合计值;
双perc=(双)每;
双倍价格=(总计-((perc/100)*总计));
整数p=price.intValue();
返回p;
}
}
简而言之,这是一个明确的问题:
我只想在EditText
的值手动更改时使用addTextChangeEventListener()
。
但是,当我使用脚本更改值时,我不想使用addTextChangeEventListner()
我怎样才能做到这一点。或者我该如何解决这个问题
-谢谢简短回答:
TextWatcher的
需要以非匿名方式定义(即使用变量),以便您可以使用addTextChangedListener(myWatcher)
注册它们,并且无论何时您想要停止它们,您都可以使用addTextChangedListener(myWatcher)取消注册它们,然后重新注册它们
完成脚本修改后
长答案
构建初始TextWatcher
变量并将它们注册到editText
// Build variables for text watchers
TextWatcher quantityWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
TextWatcher salePriceWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
TextWatcher discountWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
首先注册所有文本观察者
registerTextWatchers();
private void registerTextWatchers() {
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
holder.inputSalePrice.addTextChangedListener(salePriceWatcher);
holder.inputSaleDiscount.addTextChangedListener(discountWatcher);
}
无论何时以编程方式更改EditText
,都要注销监视程序,并在完成后再次注册它们
private void unregisterTextWatchers() {
holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
holder.inputSalePrice.removeTextChangedListener(salePriceWatcher);
holder.inputSaleDiscount.removeTextChangedListener(discountWatcher);
}
private void priceEvent(ViewHolder holder) {
//...
unregisterTextWatchers();
holder.inputSaleDiscount.setText(String.valueOf(discount));
registerTextWatchers();
}
private void discountInputEvent(ViewHolder holder, int input) {
//...
unregisterTextWatchers();
holder.inputSalePrice.setText(String.valueOf(price));
registerTextWatchers();
}
无论何时以编程方式更改
编辑文本
值简短回答:
TextWatcher的
需要以非匿名方式定义(即使用变量),以便您可以使用addTextChangedListener(myWatcher)
注册它们,并且无论何时您想要停止它们,您都可以使用addTextChangedListener(myWatcher)取消注册它们,然后重新注册它们
完成脚本修改后
长答案
构建初始TextWatcher
变量并将它们注册到editText
// Build variables for text watchers
TextWatcher quantityWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
TextWatcher salePriceWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
TextWatcher discountWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
首先注册所有文本观察者
registerTextWatchers();
private void registerTextWatchers() {
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
holder.inputSalePrice.addTextChangedListener(salePriceWatcher);
holder.inputSaleDiscount.addTextChangedListener(discountWatcher);
}
无论何时以编程方式更改EditText
,都要注销监视程序,并在完成后再次注册它们
private void unregisterTextWatchers() {
holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
holder.inputSalePrice.removeTextChangedListener(salePriceWatcher);
holder.inputSaleDiscount.removeTextChangedListener(discountWatcher);
}
private void priceEvent(ViewHolder holder) {
//...
unregisterTextWatchers();
holder.inputSaleDiscount.setText(String.valueOf(discount));
registerTextWatchers();
}
private void discountInputEvent(ViewHolder holder, int input) {
//...
unregisterTextWatchers();
holder.inputSalePrice.setText(String.valueOf(price));
registerTextWatchers();
}
无论何时以编程方式更改
EditText
值,都可以重复相同的操作您可以尝试此变通解决方案,首先您应该为每个编辑文本定义一个文本监视程序,如下所示:
private TextWatcher quantityWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
private void priceEvent(ViewHolder holder) {
holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
int discount = percentage(sellPrice, totalPrice);
holder.inputSaleDiscount.setText(String.valueOf(discount));
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
}
然后将其添加到编辑文本中,如下所示:
private TextWatcher quantityWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
private void priceEvent(ViewHolder holder) {
holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
int discount = percentage(sellPrice, totalPrice);
holder.inputSaleDiscount.setText(String.valueOf(discount));
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
}
因此,当您以编程方式设置文本时,只需从“编辑文本”中删除监视程序,在设置文本后,您可以按如下方式再次设置它:
private TextWatcher quantityWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
private void priceEvent(ViewHolder holder) {
holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
int discount = percentage(sellPrice, totalPrice);
holder.inputSaleDiscount.setText(String.valueOf(discount));
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
}
您可以尝试这种变通解决方案,首先应该为每个编辑文本定义一个文本观察程序,如下所示:
private TextWatcher quantityWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
private void priceEvent(ViewHolder holder) {
holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
int discount = percentage(sellPrice, totalPrice);
holder.inputSaleDiscount.setText(String.valueOf(discount));
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
}
然后将其添加到编辑文本中,如下所示:
private TextWatcher quantityWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
private void priceEvent(ViewHolder holder) {
holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
int discount = percentage(sellPrice, totalPrice);
holder.inputSaleDiscount.setText(String.valueOf(discount));
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
}
因此,当您以编程方式设置文本时,只需从“编辑文本”中删除监视程序,在设置文本后,您可以按如下方式再次设置它:
private TextWatcher quantityWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
private void priceEvent(ViewHolder holder) {
holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
int discount = percentage(sellPrice, totalPrice);
holder.inputSaleDiscount.setText(String.valueOf(discount));
holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
}