#java #android #android-studio
#java #Android #android-studio
Вопрос:
Используя TextWatcher для изменения букв, кажется, что он выполняет только последнюю строку (например, она изменится c
на 3
, но проигнорирует предыдущие изменения. Если я удалю последнюю строку (с по 3), она только тогда начнет меняться b
на 2
. Я не уверен, почему это или как это исправить. (Java для меня новая)
public class MainActivity extends AppCompatActivity {
TextWatcher tt = null;
private TextView textView;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText et = (EditText) findViewById(R.id.editText);
final TextView tv = (TextView) findViewById(R.id.textView);
tt = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
et.removeTextChangedListener(tt);
tv.setText(et.getText().toString().replace("a", "1"));
tv.setText(et.getText().toString().replace("b", "2"));
tv.setText(et.getText().toString().replace("c", "3"));
et.addTextChangedListener(tt);
}
@Override
public void afterTextChanged(Editable s) {
et.setSelection(s.length());
}
};
et.addTextChangedListener(tt);
Комментарии:
1. Обзор: добавление некоторого примера может помочь немного больше. В остальном ваш Q выглядит нормально!
Ответ №1:
В предоставленном коде 3 раза setText
выполняется для TextView
. Таким образом, он сохраняет результат только последнего вызова. Если вы хотите отобразить результат всех замен, сделайте это в одной строке:
et.removeTextChangedListener(tt);
tv.setText(et.getText().toString().replace("a", "1").replace("b", "2").replace("c", "3"));
et.addTextChangedListener(tt);
Редактировать:
Конечно, вы можете выполнить преобразование шаг за шагом:
et.removeTextChangedListener(tt);
String s = et.getText().toString();
s = s.replace("a", "1");
s = s.replace("b", "2");
s = s.replace("c", "3");
tv.setText(s);
et.addTextChangedListener(tt);
Метод String.replace
не изменяет строку, но возвращает новую, поэтому нам нужно переназначать результаты каждой замены (я просто назначаю s
снова и снова, чтобы предотвратить неиспользуемые ссылки)
Комментарии:
1. Я попробую это сделать. Спасибо за быстрое и простое объяснение. Мне любопытно, хотя, возможно ли это сделать, но сделать его более чистым вместо одной сверхдлинной строки?
2. @Buddhism, просмотрите обновления в asnwer, надеюсь, это поможет