Как удалить текст в EditText с помощью TextWatcher? Каждый раз, когда он обнаруживает строку и форматирует ее

У меня есть EditText с TextWatcher. Предполагается отформатировать текст на человеческую высоту, например, 5'9 дюймов, но когда пользователь делает ошибку и хочет удалить туманный символ, TextWather не позволяет ему это делать. Скажем, пользователь хочет удалить «characther the TextWather сразу же возвращает его обратно. Ниже приведен код. Итак, как мне разрешить пользователю удалять текст в EditText?

private class CustomTextWatcher implements TextWatcher { private EditText mEditText; public CustomTextWatcher(EditText e) { mEditText = e; } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } public void afterTextChanged(Editable s) { int count = s.length(); String str = s.toString(); if (count == 1) { str = str + "'"; } else if (count == 3) { str = str + "\""; } else if ((count > 4) && (str.charAt(str.length() - 1) != '\"')) { str = str.substring(0, str.length() - 2) + str.charAt(str.length() - 1) + "\""; } else { return; } mEditText.setText(str); mEditText.setSelection(mEditText.getText().length()); } 

}

Игнорируя тот факт, что Каракури сообщил о неправильном обратном вызове вашего кода, вы можете добавить простое исправление, в котором вы просто слушаете, какой ключ использует пользователь.

Без каких-либо реальных испытаний или дальнейших усовершенствований существующего кода это, похоже, устраняет описанную проблему:

 package com.example.testwatchertest; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.View; import android.view.View.OnKeyListener; import android.widget.EditText; public class MainActivity extends Activity implements TextWatcher { EditText editText; boolean keyDel = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText); editText.addTextChangedListener(this); editText.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL){ keyDel = true; }else{ keyDel = false; } return false; } }); } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (!keyDel) { String str = s.toString(); if (count == 1) { str = str + "'"; } else if (count == 3) { str = str + "\""; } else if ((count > 4) && (str.charAt(str.length() - 1) != '\"')) { str = str.substring(0, str.length() - 2) + str.charAt(str.length() - 1) + "\""; } else { return; } editText.setText(str); editText.setSelection(editText.getText().length()); } } } 

Из документов :

Public abstract void onTextChanged (CharSequence s, int start, int before, int count)

Этот метод вызывается, чтобы уведомить вас о том, что в течение s символы count, начинающиеся с момента запуска, только что заменили старый текст, длина которого ранее. Ошибка при попытке внести изменения в s из этого обратного вызова.

Вы должны внести любые изменения в afterTextChanged (), а не в любой из двух других обратных вызовов.

Public abstract void afterTextChanged (Редактируемые)

Этот метод вызван, чтобы уведомить вас, что где-то в s текст был изменен. Допустимо делать дальнейшие изменения s в этом обратном вызове, но будьте осторожны, чтобы не попасть в бесконечный цикл, потому что любые сделанные вами изменения заставят этот метод вызываться снова рекурсивно. (Вам не сообщается, где произошло изменение, потому что другие afterTextChanged() возможно, уже внесли другие изменения и сделали недействительными смещения. Но если вам нужно знать здесь, вы можете использовать setSpan(Object, int, int, int) в onTextChanged(CharSequence, int, int, int) чтобы отметить ваше место, а затем посмотреть отсюда, где закончился диапазон.)

Intereting Posts
Существует ли ограничение на количество обновлений для одного апка для публикации или загрузки на Android Market (Google Play Store)? Как использовать новую библиотеку привязки данных Android для заполнения дочерних элементов LinearLayout на основе коллекции? Android Studio: эмулятор уже запущен DoToFront не работает в RecyclerView Как избежать кэшированных ожидающих намерений? LinearLayour ниже ListView не отображается Получение силы сигнала без активности Настройка res srcDirs для androidTest sourceSet Как добавить SHA-1 в приложение для Android Изображение Captcha не может быть обновлено с помощью Glide Как использовать это ключевое слово в статическом методе в java? Как настроить мою персональную клавиатуру в качестве стандартного ввода в моем приложении Android: открытие ContextMenu из onLongPress в пользовательском WebView Отображение контактов только с телефонными номерами с использованием намерения ACTION_PICK в Android-устройстве Ksoap2 xmlPullParserException unterminited entity ref