android TextWatcher更改外部类私有字段

时间:2013-12-08 18:34:59

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

我的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中执行具有pass-by-reference效果的东西,或者我可以采用哪些其他方法将outerclass变量传递给innerclass,并且该变量可以在innerclass中更新?

1 个答案:

答案 0 :(得分:0)

请记住,数组获取地址传递的值,而不是值。也许你应该尝试类似的东西:

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。 希望它符合您的需求。