【问题标题】:Remove addTextChangedListener() When the EditText values changed programmatically not manually删除 addTextChangedListener() 当 EditText 值以编程方式而不是手动更改时
【发布时间】:2021-04-26 23:04:36
【问题描述】:

我在一个网站上工作,我正在使用 Javascript 更改文本更改文本。

  1. 当用户更改数量时,我将更改总价和售价值。
  2. 当用户更改销售价格时,我正在更改折扣值。
  3. 当用户更改折扣时,我正在更改销售价格值。

现在我想要在我的 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) {

        }
    });

折扣EditText。

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 的值时,例如更改 数量 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;
        }
    }

简短的问题:

我只想在addTextChangeEventListener() 的值时手动更改EditText。 但是当我使用脚本更改值时,我不想使用addTextChangeEventListner()

我怎样才能做到这一点。或者我该如何解决这个问题。

-谢谢

【问题讨论】:

    标签: java android android-edittext listener


    【解决方案1】:

    简答:

    TextWatcher's 需要以非匿名方式定义(即使用变量),以便您可以使用 addTextChangedListener(myWatcher) 注册它们,并且每当您想停止它们时,您可以使用 removeTextChangedListener(myWatcher) 取消注册它们,然后完成脚本修改后,使用 addTextChangedListener(myWatcher) 重新注册它们。

    长答案

    构建初始TextWatcher 变量并将它们注册到EditTexts

    // 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 值时重复相同的操作

    【讨论】:

      【解决方案2】:

      你可以试试这个解决方案,首先你应该为每个编辑文本定义一个文本观察器,如下所示:

      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);
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        • 2018-12-13
        • 2011-01-16
        • 1970-01-01
        • 2015-07-28
        相关资源
        最近更新 更多