2014-11-03 3 views
0

У меня есть textwatcher в нескольких блоках editText, которые принимают вычисления и выводят результат в Textview. Тем не менее, мне также нужен способ использования DecimalFormat, чтобы после того, как пользователь ввел его в editText, он форматирует его так: «$ ###, ###, ###. 00». Я думал об использовании OnFocusChangedListener, но похоже, что он все равно вызовет событие afterTextChanged. Как мне это сделать, чтобы в итоге не было переполнения стека?AfterTextChanged и OnFocusChangedListener

textwatcher вызывает метод как это:

TextWatcher Watch = new TextWatcher() { 

    @Override 
    public void afterTextChanged(Editable s) { 
     calc(); 

    } 
private void calc() { 
Editable eValue1 = new.getText(), eValue2 = ti.getText(), eValue3 = acc.getText(); 
Double value1 = 0.0, value2 = 0.0, value3 = 0.0, result = 0.0; 

if (eValue1 != null) 
    value1 = toDouble(eValue1); 
if (eValue2 != null) 
    value2 = toDouble(eValue2); 
if (eValue3 != null) 
    value3 = toDouble(eValue3); 
if (value1 != null && value2 != null && value3 != null) 
    result = value1 - (value2 + value3); 
    td.setText(formatCur(result)); 

} 
    private String formatCur(Double result) { 
    DecimalFormat df = new DecimalFormat("$###,###,###.00"); 
    String format = df.format(result); 
    return format; 
} 

ответ

1

ли вы попробуйте удалить слушатель, установив текст, а затем снова добавив слушатель?

+0

Не уверен, что это сработает. Слушатели используются для динамического вывода вычислений без необходимости «вычисления». Я отправил код выше, если у вас есть идеи. –

+0

Просто добавьте private boolean _textModifiedByWatcher = false; который вы установили в true после изменения текста в наблюдателе. В afterTextChanged вы проверяете, является ли _textModifiedByWatcher истинным. Если это так, вы устанавливаете значение false и немедленно возвращаетесь. –

+0

Я пробовал это, но что-то не так хорошо работает. Не могли бы вы добавить простой пример? Я новичок в Android и Java. –