android TextWatcher 更改 outerclass 私有字段

android TextWatcher changing outerclass private field

提问人:Jack Tsai 提问时间:12/9/2013 更新时间:12/9/2013 访问量:343

问:

我的 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) {}

    });

我想尝试删除多余的代码,因为我在活动中有很多 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) {}
}

但是这样就行不通了,因为 outerclass 变量仍然没有被分配新值,因为它是按值传递的。我将如何在 Java 中做一些具有引用传递效果的事情,或者我可以做些什么其他方法可以将外部类变量传递给内部类并且该变量可以在内部类中得到更新?

Java Android 按引用传递

评论


答:

0赞 Junior Buckeridge 12/9/2013 #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。 希望它适合您的需求。