2012-09-13 64 views
1

這無限循環我需要格式化用戶輸入的字符串在EditField上。 這是我的代碼:黑莓 - 如何避免在此FieldChangeListener.fieldChanged

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"; 
} 

但它在計算器結束錯誤造成的,因爲一個無限循環的明顯。 代碼有什麼問題?

+0

此答案不適用於我的情況:http://stackoverflow.com/a/7571696/1293724 – Lucas

回答

3

您可以通過檢查這是否是內部更新來阻止遞歸。 於黑莓手機,這是通過檢查的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; 
      } 
     } 
    } 
}); 
+0

謝謝德文。它現在有效! – Lucas

+0

@Lucas根據FieldChangeListener.PROGRAMMATIC檢查'context'的值是決定如何觸發change事件的另一種方法。 – Rupak

+1

@Rupak謝謝,我已經更新了我的答案。 –