如何在Android中使用TextWatcher类?

任何人都可以告诉我如何在EditText中掩盖子字符串或如何将EditText子字符串输入更改为密码类型或替换为另一个字符,如123xxxxxxxxx3455

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

请告诉我如何在Android中使用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参数是应用任何改变之前的文本
start参数是文本中变化部分的start 位置
count参数是从start位置起s序列中被改变部分的长度
after参数是新序列长度,它将从startstart+count代替s序列的部分。
不能从此方法更改 TextView的文本(通过使用myTextView.setText(String newText) )。

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

beforeTextChanged方法类似,但文本更改调用。
s参数是应用更改后的文本
start参数与beforeTextChanged方法相同。
count参数是beforeTextChanged方法中的after参数。
before参数是beforeTextChanged方法中的count参数。
不能从此方法更改 TextView的文本(通过使用myTextView.setText(String newText) )。

3 afterTextChanged(Editable s)

可以从这个方法改变 TextView的文本。
/!\警告:当您更改TextView的文本时, TextWatcher将再次触发,启动无限循环。 您应该添加像boolean _ignore属性,防止无限循环。
例:

 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... } 

概要:

在这里输入图像描述

我的自定义侦听器:

就我个人而言,我制作了我的自定义文本监听器,这个监听器为我提供了四个单独的字符串,这对我来说,使用起来更直观。

  /** * 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(); } 

在Android中使用TextWatcher

这是一个示例代码。 尝试使用TextView的addTextChangedListener方法

 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