Я хочу создать приложение, которое может преобразовывать текст, который пользователь вводит в виджет EditText
в режиме реального времени, и я добавил TextWatcher
, чтобы позволить мне что-то делать при изменении текста, но это вызывает переполнение ошибка, потому что я в основном создаю бесконечный цикл (onTextChange -> code to change text -> onTextChange -> etc...
).
Кто-нибудь получил представление о том, как обойти эту проблему?
Вот пример
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");
}
И хотя вышеприведенное, похоже, действительно работает, я не могу заставить его работать с Html.fromHtml();
, что я и собираюсь использовать.
отредактировано снова
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!");
}
}
Это выбрасывает StackOverflowException
в строке 37, которая "text.setText("Test!");
"