I want to create an application that can transform text the user enters in an EditText
widget in real time, and I've added a TextWatcher
to allow me to do stuff on text change, but it's causing an overflow error because I'm basically creating an endless loop (onTextChange -> code to change text -> onTextChange -> etc...
).
Anyone got an idea on how to get around this issue?
Here's an example
private boolean isEditable = true;
private EditText text;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (EditText) findViewById(R.id.editText1);
text.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (isEditable) {
isEditable = false;
styleText(s.toString());
} else {
isEditable = true;
}
}
});
}
private void styleText(String completeText) {
text.setText(completeText + " test");
}
And while the above actually seems to be working, I cannot get it to work with Html.fromHtml();
, which is what I intend to use.
EDITED AGAIN
public class Main extends Activity implements TextWatcher {
private EditText text;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (EditText) findViewById(R.id.editText1);
text.addTextChangedListener(this);
}
@Override
public void afterTextChanged(Editable s) {
text.removeTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
text.addTextChangedListener(this);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
text.removeTextChangedListener(this);
text.setText("Test!");
}
}
It's throwing a StackOverflowException
on line 37, which is "text.setText("Test!");
"