У меня есть форма, в которой пользователь может ввести некоторые данные в поля EditText. Один из этих виджетов EditText предназначен для адреса электронной почты. Я использую TextWatcher, чтобы убедиться, что текст всегда в нижнем регистре, следующим образом:
txtEmail.addTextChangedListener(new TextWatcher()
{
String prevString = "";
boolean delAction = false;
@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 (s.length() < prevString.length())
delAction = true;
else
delAction = false;
}
@Override
public void afterTextChanged(Editable s)
{
if (!delAction)
{
String temp = s.toString().toLowerCase();
if (!temp.equals(prevString))
{
prevString = temp;
txtEmail.setText(temp); // Recursive
txtEmail.setSelection(temp.length());
}
}
else
{
prevString = s.toString();
}
}
});
В onTextChanged(...)
я также сравниваю, чтобы убедиться, что удаление работает правильно.
Теперь к проблеме. txtEmail.setText(temp);
заставляет весь Наблюдатель работать рекурсивно. Я могу управлять положением каретки, чтобы перейти в конец EditText, добавив txtEmail.setSelection(temp.length());
и выйти из рекурсивного цикла с помощью if
, но я не могу найти способ сохранить каретку в определенной точке. Если, например, я написал "myema(ilmissing)@something.com и хочу вернуться, чтобы исправить каждую введенную букву, знак вставки будет стоять в конце строки.
Теперь самое странное. Я попытался сохранить положение каретки перед beforeTextChanged(...)
или в onTextChanged(...)
. В тот момент, когда я что-то набираю, положение каретки в каждом случае корректно меняется. Однако в тот момент, когда мы входим в рекурсивный вызов, положение каретки сообщается как 0. Я предполагаю, что когда я на самом деле печатаю, движение каретки также регистрируется, но поскольку в рекурсивном вызове нет движения каретки, а не «вставка». " текста в EditText я не получаю изменения позиции.
И поэтому вопрос: как я могу сохранить положение каретки? У меня была мысль на самом деле подставить текст. Поместите все в каретку, внесите изменения, бросьте их туда с помощью txtEmail.setSelection(temp.length());
, а затем добавьте остальную часть строки на шаге else (пока еще не пробовал). Есть ли другой (более простой/эффективный) способ справиться с этим с помощью встроенных инструментов?
Заранее спасибо!