下面是我的textwatcher类我试图根据列表的edittext中的更改来更改列表的textview内容。
public class MtQtyWatcher implements TextWatcher {
View v;
public MtQtyWatcher(View v){
this.v = v;
}
public void afterTextChanged(Editable s) {
String qty = s.toString().trim();
int quantity = qty.equals("")?0:Integer.parseInt(qty);
EditText edtQty = (EditText)v.findViewById(R.id.qty);
Item item = (Item)edtQty.getTag();
if(item.getQty()!=quantity){
edtQty.setText(qty);
item.setQty(quantity);
float newRate = quantity * (item.getRate());
item.setAmt(newRate);
TextView txtAmt = (TextView) v.findViewById(R.id.amt);
txtAmt.setText(""+item.getAmt());
}
}
public void beforeTextChanged(CharSequence s, int start, int count,int after) {}
public void onTextChanged(CharSequence s, int start, int before,int count) {}
}
这是以下stacktrace
04-10 15:00:13.179: E/AndroidRuntime(24454): FATAL EXCEPTION: main
04-10 15:00:13.179: E/AndroidRuntime(24454): java.lang.StackOverflowError
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.SpannableStringBuilder.getSpans(SpannableStringBuilder.java:783)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence.getSpans(ReplacementTransformationMethod.java:184)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Styled.drawUniformRun(Styled.java:67)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Styled.drawDirectionalRun(Styled.java:322)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Styled.measureText(Styled.java:454)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Layout.measureText(Layout.java:1971)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Layout.getLineMax(Layout.java:912)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Layout.getLineMax(Layout.java:886)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Layout.getHorizontal(Layout.java:742)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Layout.getHorizontal(Layout.java:703)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.text.Layout.getPrimaryHorizontal(Layout.java:688)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.getFocusedRect(TextView.java:4522)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.FocusFinder.findNextFocus(FocusFinder.java:72)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.ViewGroup.focusSearch(ViewGroup.java:476)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.View.focusSearch(View.java:3494)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.onCreateInputConnection(TextView.java:4922)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:945)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:900)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2734)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2676)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.EditText.setText(EditText.java:178)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2651)
04-10 15:00:13.179: E/AndroidRuntime(24454): at com.eshopping.u.ItemList$MtQtyWatcher.afterTextChanged(ItemList.java:144)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.sendAfterTextChanged(TextView.java:6724)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2822)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2676)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.EditText.setText(EditText.java:178)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2651)
04-10 15:00:13.179: E/AndroidRuntime(24454): at com.eshopping.u.ItemList$MtQtyWatcher.afterTextChanged(ItemList.java:144)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.sendAfterTextChanged(TextView.java:6724)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2822)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2676)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.EditText.setText(EditText.java:178)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2651)
04-10 15:00:13.179: E/AndroidRuntime(24454): at com.eshopping.u.ItemList$MtQtyWatcher.afterTextChanged(ItemList.java:144)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.sendAfterTextChanged(TextView.java:6724)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2822)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2676)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.EditText.setText(EditText.java:178)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2651)
04-10 15:00:13.179: E/AndroidRuntime(24454): at com.eshopping.u.ItemList$MtQtyWatcher.afterTextChanged(ItemList.java:144)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.sendAfterTextChanged(TextView.java:6724)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2822)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2676)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.EditText.setText(EditText.java:178)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2651)
04-10 15:00:13.179: E/AndroidRuntime(24454): at com.eshopping.u.ItemList$MtQtyWatcher.afterTextChanged(ItemList.java:144)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.sendAfterTextChanged(TextView.java:6724)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2822)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2676)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.EditText.setText(EditText.java:178)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2651)
04-10 15:00:13.179: E/AndroidRuntime(24454): at com.eshopping.u.ItemList$MtQtyWatcher.afterTextChanged(ItemList.java:144)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.sendAfterTextChanged(TextView.java:6724)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2822)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2676)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.EditText.setText(EditText.java:178)
04-10 15:00:13.179: E/AndroidRuntime(24454): at android.widget.TextView.setText(TextView.java:2651)
04-10 15:00:13.179: E/AndroidRuntime(24454): a
答案 0 :(得分:2)
我向我看,就像其中一个setTexts以递归方式调用了观察者。
解决此问题的一种方法是添加一个布尔值来停止重新进入。
public class MtQtyWatcher implements TextWatcher {
boolean running = false;
View v;
public MtQtyWatcher(View v){
this.v = v;
}
public void afterTextChanged(Editable s) {
if(!running){
running = true;
// add your stuff here
running = false;
}
}
}
答案 1 :(得分:2)
public class MtQtyWatcher implements TextWatcher {
View view ;
public MtQtyWatcher(View view ){
this.view = view;
}
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count,int after) {}
public void onTextChanged(CharSequence s, int start, int before,int count) {
if(s.length()>0){
try{
String strQty = s.toString().trim();
int quantity = Integer.parseInt(strQty);
EditText txtQty = (EditText) view.findViewById(R.id.qty);
Item item = (Item)txtQty.getTag();
if (item.getQty()!=quantity){
item.setQty(quantity);
TextView txtAmt = (TextView) view.findViewById(R.id.amt);
float amt = quantity * (item.getRate());
item.setAmt(amt);
txtAmt.setText(String.valueOf(amt));
}
}catch(Exception e){
Log.e(Tag,"onTextChnaged "+e);
e.printStackTrace();
}
}
}
}
答案 2 :(得分:0)
您的TextWatcher是否附加到EditText edtQty?如果是这样,你将获得无限递归,因为你正在修改EditText中的文本,它将再次调用afterTextChanged。
答案 3 :(得分:0)
TextWatcher中的setText导致无限堆栈循环。
我建议改用InputFilter。
答案 4 :(得分:0)
您也可以在调用setText方法之前从edittext中删除textwatcher; 在settext之后,你需要再次添加textwatcher。