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

しかし、それは明らかに無限ループが原因で発生したスタックオーバーフローエラーで終了します。コードの何が問題になっていますか?

4

2 に答える 2

3

これが内部更新であるかどうかを確認することで、再発を防ぐことができます。ブラックベリーの場合、これは次の値をチェックすることによって行われます。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;
            }
        }
    }
});
于 2012-09-13T18:23:19.457 に答える
1

のAPIドキュメントを確認してくださいnet.rim.device.api.ui.FieldChangeListener

メソッドが呼び出されると、パラメーターを値とvoid fieldChanged(Field field, int context)照合できます。contextFieldChangeListener.PROGRAMMATIC

contextがに等しい 場合 FieldChangeListener.PROGRAMMATIC、変更はプログラムで行われました。それ以外の場合は、ユーザーの操作でした。

于 2012-09-15T02:55:24.563 に答える