Black Berry - 如何在此FieldChangeListener.fieldChanged中避免此无限循环

时间:2012-09-13 18:17:54

标签: java blackberry

我需要格式化用户在EditField上输入的字符串。 这是我的代码:

input = new BorderedEditField(20, BasicEditField.FILTER_NUMERIC);

input.setChangeListener(new FieldChangeListener() {             
    public void fieldChanged(Field field, int context) {
        input.setText(pruebaTexto(input.getText()));
    }
});

public static String pruebaTexto(String r){
    return r+"0";
}

但它结束于由于无限循环而导致的stackoverflow错误。 代码有什么问题?

2 个答案:

答案 0 :(得分:3)

您可以通过检查这是否是内部更新来阻止递归。 对于Blackberry,可以通过检查context

的值来完成
input.setChangeListener(new FieldChangeListener() {
    public void fieldChanged(Field field, int context) {
        if (context != FieldChangeListener.PROGRAMMATIC) {
            input.setText(pruebaTexto(input.getText()));
        }
    }
});

这是一个非Blackberry特定的解决方案,适用于任何类型的听众:

input.setChangeListener(new FieldChangeListener() {
    private boolean internalCall = false;
    public void fieldChanged(Field field, int context) {
        if (!internalCall) {
            internalCall = true;
            try {
                input.setText(pruebaTexto(input.getText()));
            }
            finally {
                internalCall = false;
            }
        }
    }
});

答案 1 :(得分:1)

查看net.rim.device.api.ui.FieldChangeListener的API文档。

调用方法void fieldChanged(Field field, int context)后,您可以针对值FieldChangeListener.PROGRAMMATIC检查参数 context

如果 context 等于FieldChangeListener.PROGRAMMATIC,则更改是以编程方式进行的,否则就是用户互动。