我需要格式化用户在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错误。 代码有什么问题?
答案 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
,则更改是以编程方式进行的,否则就是用户互动。