Как использовать класс TextWatcher в Android?

Может ли кто-нибудь сказать мне, как замаскировать подстроку в EditText или как изменить вход подстроки EditText на тип пароля или заменить другим символом, подобным этому 123xxxxxxxxx3455

String contents = et1.getText().toString(); et1.setText(contents.replace.substring(0, contents.length()-2),"*"); 

Пожалуйста, расскажите, как я могу использовать метод TextWatcher в Android.

Solutions Collecting From Web of "Как использовать класс TextWatcher в Android?"

Edit: Я не являюсь оригинальным ответчиком. Я понятия не имею, как это сообщение получило так много upvotes, когда оно ничего не объясняет. Я сохранил исходный контент ниже, но, пожалуйста, см. Этот ответ для более подробного объяснения каждого метода и примеров.

Не могли бы вы проверить вопрос? Что было спрошено? Этот ответ дает достаточно информации для вопроса? Ответ, который содержится в ссылке, является слишком большой информацией. Он подходит для вопроса типа. Что такое textwatcher и как он работает? Какие внутренние подробности об этом? Наверное, это и есть причина, по которой есть много подвигов. Отвечать только на то, что задают? Слишком много соли разрушает пищу.


Для использования TextWatcher ..

 et1.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 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 afterTextChanged(Editable s) { // TODO Auto-generated method stub } }); 

Интерфейс TextWatcher имеет 3 метода обратных вызовов, которые вызываются в следующем порядке, когда в текст произошли изменения:

1 beforeTextChanged(CharSequence s, int start, int count, int after)

: Вызывается, прежде чем изменения будут применены к тексту.
Параметр s является текстом перед применением любого изменения.
Стартовый параметр – это позиция начала измененной части текста.
Параметр параметра count – это длина измененной части в последовательности s с момента start .
И after параметра – это длина новой последовательности, которая заменит часть последовательности s от start до start+count .
Вы не должны изменять текст в TextView из этого метода (используя myTextView.setText(String newText) ).

2 onTextChanged(CharSequence s, int start, int before, int count)

Подобно методу beforeTextChanged но beforeTextChanged после изменения текста.
Параметр sэто текст после внесения изменений.
Параметр start такой же, как и в методе beforeTextChanged .
Параметр параметра count является параметром after в методе beforeTextChanged.
И параметр before параметром является параметром count в методе beforeTextChanged.
Вы не должны изменять текст в TextView из этого метода (используя myTextView.setText(String newText) ).

3 afterTextChanged(Editable s)

Вы можете изменить текст в TextView с помощью этого метода.
/! \ Предупреждение. Когда вы меняете текст в TextView , TextWatcher будет запускаться снова, начиная бесконечный цикл. Затем вы должны добавить как свойство boolean _ignore которое предотвращает бесконечный цикл.
Exemple:

 new TextWatcher() { boolean _ignore = false; // indicates if the change was made by the TextWatcher itself. @Override public void afterTextChanged(Editable s) { if (_ignore) return; _ignore = true; // prevent infinite loop // Change your text here. // myTextView.setText(myNewText); _ignore = false; // release, so the TextWatcher start to listen again. } // Other methods... } 

Резюме:

Введите описание изображения здесь

Мой пользовательский прослушиватель:

Лично я сделал свой пользовательский текстовый прослушиватель, который дает мне 4 части текстов в отдельной строке, что гораздо более интуитивно понятно для использования, я думаю.

  /** * Text view listener which splits the update text event in four parts: * <ul> * <li>The text placed <b>before</b> the updated part.</li> * <li>The <b>old</b> text in the updated part.</li> * <li>The <b>new</b> text in the updated part.</li> * <li>The text placed <b>after</b> the updated part.</li> * </ul> * Created by Jeremy B. */ public abstract class TextViewListener implements TextWatcher { /** * Unchanged sequence which is placed before the updated sequence. */ private String _before; /** * Updated sequence before the update. */ private String _old; /** * Updated sequence after the update. */ private String _new; /** * Unchanged sequence which is placed after the updated sequence. */ private String _after; /** * Indicates when changes are made from within the listener, should be ommitted. */ private boolean _ignore = false; @Override public void beforeTextChanged(CharSequence sequence, int start, int count, int after) { _before = sequence.subSequence(0,start).toString(); _old = sequence.subSequence(start, start+count).toString(); _after = sequence.subSequence(start+count, sequence.length()).toString(); } @Override public void onTextChanged(CharSequence sequence, int start, int before, int count) { _new = sequence.subSequence(start, start+count).toString(); } @Override public void afterTextChanged(Editable sequence) { if (_ignore) return; onTextChanged(_before, _old, _new, _after); } /** * Triggered method when the text in the text view has changed. * <br/> * You can apply changes to the text view from this method * with the condition to call {@link #startUpdates()} before any update, * and to call {@link #endUpdates()} after them. * * @param before Unchanged part of the text placed before the updated part. * @param old Old updated part of the text. * @param aNew New updated part of the text? * @param after Unchanged part of the text placed after the updated part. */ protected abstract void onTextChanged(String before, String old, String aNew, String after); /** * Call this method when you start to update the text view, so it stops listening to it and then prevent an infinite loop. * @see #endUpdates() */ protected void startUpdates(){ _ignore = true; } /** * Call this method when you finished to update the text view in order to restart to listen to it. * @see #startUpdates() */ protected void endUpdates(){ _ignore = false; } } 

Пример использования:

 myEditText.addTextChangedListener(new TextViewListener() { @Override protected void onTextChanged(String before, String old, String aNew, String after) { // intuitive usation of parametters String completeOldText = before + old + after; String completeNewText = before + aNew + after; // update TextView startUpdates(); // to prevent infinite loop. myEditText.setText(myNewText); endUpdates(); } 

Использование TextWatcher в Android

Вот пример кода. Попробуйте использовать метод addTextChangedListener для TextView

 addTextChangedListener(new TextWatcher() { BigDecimal previousValue; BigDecimal currentValue; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (isFirstTimeChange) { return; } if (s.toString().length() > 0) { try { currentValue = new BigDecimal(s.toString().replace(".", "").replace(',', '.')); } catch (Exception e) { currentValue = new BigDecimal(0); } } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (isFirstTimeChange) { return; } if (s.toString().length() > 0) { try { previousValue = new BigDecimal(s.toString().replace(".", "").replace(',', '.')); } catch (Exception e) { previousValue = new BigDecimal(0); } } } @Override public void afterTextChanged(Editable editable) { if (isFirstTimeChange) { isFirstTimeChange = false; return; } if (currentValue != null && previousValue != null) { if ((currentValue.compareTo(previousValue) > 0)) { //setBackgroundResource(R.color.devises_overview_color_green); setBackgroundColor(flashOnColor); } else if ((currentValue.compareTo(previousValue) < 0)) { //setBackgroundResource(R.color.devises_overview_color_red); setBackgroundColor(flashOffColor); } else { //setBackgroundColor(textColor); } handler.removeCallbacks(runnable); handler.postDelayed(runnable, 1000); } } }); 

Немного большая перспектива решения:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.yourlayout, container, false); View tv = v.findViewById(R.id.et1); ((TextView) tv).addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { SpannableString contentText = new SpannableString(((TextView) tv).getText()); String contents = Html.toHtml(contentText).toString(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } }); return v; } 

Это работает для меня, делая это в первый раз.

Создайте собственный подкласс TextWatcher:

 public class CustomWatcher implements TextWatcher { private boolean mWasEdited = 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) { } @Override public void afterTextChanged(Editable s) { if (mWasEdited){ mWasEdited = false; return; } // get entered value (if required) String enteredValue = s.toString(); String newValue = "new value"; // don't get trap into infinite loop mWasEdited = true; // just replace entered value with whatever you want s.replace(0, s.length(), newValue); } } 

Установите прослушиватель для вашего EditText:

 mTargetEditText.addTextChangedListener(new CustomWatcher()); 
  public class Test extends AppCompatActivity { EditText firstEditText; EditText secondEditText; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); firstEditText = (EditText)findViewById(R.id.firstEditText); secondEditText = (EditText)findViewById(R.id.secondEditText); firstEditText.addTextChangedListener(new EditTextListener()); } private class EditTextListener implements 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) { secondEditText.setText(firstEditText.getText()); } @Override public void afterTextChanged(Editable s) { } } } 
 editext1.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { editext2.setText(new String(s.toString())); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { editext2.setText(new String(s.toString())); } @Override public void afterTextChanged(Editable s) { editext2.setText(new String(s.toString())); } }); 

Для получения дополнительной информации нажмите здесь http://androiddhina.blogspot.in/2015/05/android-textwatcher.html