Intereting Posts
Как я могу показать DialogFragment с помощью пакета совместимости? Использование Getter и Setter для arraylist в java Какова минимальная версия Служб Google для использования Firebase? Как установить атрибут Last Modified File с помощью нового API доступа к SD-карте для Android 5.0? Как установить ширину ListView в PopupWindow на Android? Как получить имя установленного приложения в android? Rjava.lang.IllegalArgumentException on startActivity (намерение, анимация пакетов) Android: добавьте «внутренние» ссылки в часть TextView, которая ссылается на действие в моем коде Утечка памяти Android ViewPager Как вычислить требуемую высоту GridView, находящегося внутри ScrollView на Android? GetActivity (). FindViewById возвращает null, вызывается из фрагмента onActivityCreated Сообщение об ошибке – исходное вложение не содержит источника для файла ListView.class Генерировать non-debug apk от ионного JsonMappingException: бесконечная рекурсия в отношении OneToMany в Objectify Должен ли я использовать аутентификацию пользователя на основе входа в Android-приложении

Как удалить текст в 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) чтобы отметить ваше место, а затем посмотреть отсюда, где закончился диапазон.)