Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当EditText值以编程方式而不是手动更改时,请删除addTextChangedListener()_Java_Android_Android Edittext_Listener - Fatal编程技术网

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
更改文本

  • 当用户更改数量时,我正在更改总价和销售价格值
  • 当用户更改销售价格时,我正在更改折扣值
  • 当用户更改折扣时,我正在更改销售价格值
  • 现在,我想在我的android应用程序中实现同样的功能

    我在每个
    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);
    
        }