【问题标题】:android TextWatcher changing outerclass private fieldandroid TextWatcher 更改外部类私有字段
【发布时间】:2013-12-25 18:35:46
【问题描述】:

我的 MainFragment 中有多个 String 变量和 EditText 变量。对于所有的 EditText,我希望我的 String 变量在 EditText 的文本更改后分配值。目前我是这样做的:

private String itemName;
private String itemNumber;
private EditText itemNameET;
private EditText itemNumberET;
private void initEditTexts() {
    itemName = itemNameET.getText().toString();
    itemNumber = itemNumberET.getText().toString();
    itemNameET.addTextChangedListener(new TextWatcher() {
        @Override
        public void afterTextChanged(Editable s) {
            itemName = (String) s.toString();
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
            int arg2, int arg3) {}

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
            int count) {}

    });

    itemNumberET.addTextChangedListener(new TextWatcher() {
        @Override
        public void afterTextChanged(Editable s) {
            itemNumber = (String) s.toString();
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
            int arg2, int arg3) {}

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
            int count) {}

    });

我想尝试删除多余的代码,因为我在 Activity 中有很多 EditTexts。我正在考虑一起创建一个 CustomTextWatcher:

public class CustomTextWatcher implements TextWatcher {
    private String text;
    public CustomTextWatcher(String text) {
        this.text = text;
    }

    @Override
    public void afterTextChanged(Editable s) {
        text = (String) s.toString();
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1,
        int arg2, int arg3) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
        int count) {}
}

但是这将不起作用,因为外部类变量仍未分配新值,因为它是按值传递的。我将如何在 Java 中执行具有传递引用效果的操作,或者我可以采取哪些其他方式将外部类变量传递给内部类并且该变量可以在内部类中更新?

【问题讨论】:

    标签: java android pass-by-reference pass-by-value


    【解决方案1】:

    请记住,数组获取通过地址而不是值传递的值。也许您应该尝试以下方法:

    public  class CustomTextWatcher implements TextWatcher {
        private String [] text;
        public CustomTextWatcher(String[] text) {
            this.text = text;
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            text[0] = (String) s.toString();
        }
    
        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
            int arg2, int arg3) {}
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
            int count) {}
    }
    

    当然,您应该始终注意验证数组的大小以避免 NullPointerException。 希望它适合您的需求。

    【讨论】:

      猜你喜欢
      • 2014-12-06
      • 2021-06-14
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2013-09-01
      • 1970-01-01
      相关资源
      最近更新 更多