1

我需要格式化用户在 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错误结束。代码有什么问题?

4

2 回答 2

3

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

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

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

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;
            }
        }
    }
});
于 2012-09-13T18:23:19.457 回答
1

检查net.rim.device.api.ui.FieldChangeListener.

当方法void fieldChanged(Field field, int context)被调用时,您可以context根据值检查参数FieldChangeListener.PROGRAMMATIC

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

于 2012-09-15T02:55:24.563 回答