如何在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
参数是新序列的长度,它将从start
到start+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