2016-06-01 57 views
1

我有這樣的代碼:addTextChangedListener拋出的StackOverflow錯誤

areasqm.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable arg0) { 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    } 

    @Override 
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
     double val = Double.parseDouble(areasqm.getText().toString()); 
     areaha.setText(String.valueOf(val/10000)); 
    }  
}); 

areaha.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable arg0) { 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    } 

    @Override 
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
     double val = Double.parseDouble(areaha.getText().toString()); 
     areasqm.setText(String.valueOf(val*10000)); 
    }  
}); 

每當我鍵入的EditTexts的一個值,我的應用程序會崩潰並引發java.lang.StackOverflowError的

爲什麼?如何解決這個問題?

+0

第一校驗值是空或不是,如果(s.length()== 0){//你的代碼} –

+1

嘗試設置在afterTextChanged(值),而不是onTextChanged() – Mehta

+0

你正在做一個遞歸調用。 (textChanged - > setText - > textChanged ...) – Jiyeh

回答

4

的原因是:當你調用areaha.setText(String.valueOf(val/10000));TextChangedListener的areaha被觸發,並呼籲areasqm.setText(String.valueOf(val*10000));,所以TextChangedListener的 areasqm被觸發過,並呼籲areaha.setText(String.valueOf(val/10000));。所以你有永恆的循環,並因此導致這個java.lang.StackOverflowError

你可以嘗試這樣的事情。

private TextWatcher areasmlWatcher = new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable arg0) { 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    } 

    @Override 
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
     double val = Double.parseDouble(areasqm.getText().toString()); 
     areaha.removeTextChangedListener(areahaWatcher); 
     areaha.setText(String.valueOf(val/10000)); 
     areaha.addTextChangedListener(areahaWatcher); 
    } 
}; 

private TextWatcher areahaWatcher = new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable arg0) { 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    } 

    @Override 
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
     double val = Double.parseDouble(areaha.getText().toString()); 
     areasqm.removeTextChangedListener(areasmlWatcher); 
     areasqm.setText(String.valueOf(val*10000)); 
     areasqm.addTextChangedListener(areasmlWatcher); 
    } 
}; 

private void someMethod() { 
    areasqm.addTextChangedListener(areasmlWatcher); 
    areaha.addTextChangedListener(areahaWatcher); 
} 
+0

那麼如何解決它? –

+0

你應該改變你的代碼的邏輯。我不知道你想要什麼結果。 – Alexander

+0

您可以將編輯的值設置爲另一個「TextView」。 – Jiyeh

1

你得到這個錯誤是由於按你的代碼,它在無限循環兩種編輯短信連續更新彼此價值

+0

那麼我該如何解決它? –

+1

請通過此鏈接http://stackoverflow.com/questions/25407959/textwatcher-giving-stackoverflow-error – prat

+0

嘗試添加addTextChangedListener焦點增益並刪除它時編輯文本丟失焦點 –

1

如前所述,java.lang.StackOverflowError的是由於遞歸當您更改編輯文本時,請撥打onTextChanged()setText()

既然你想乘以1000的輸入值,有什麼我能想到做的是:

@Override 
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    double val = Double.parseDouble(areaha.getText().toString()); 
    if (val % 10000 != 0) { 
     val = val * 10000; 
     areasqm.setText(String.valueOf(val)); 
    } 
} 

但是記住,這是與條件是你的value_entered爲int,而不是增加一倍或浮動(十進制)。

希望這有助於;)

+1

仍然無法正常工作..它拋出StackOverflow錯誤,但無論如何謝謝。我很感激! –