我对TextWatcher
有点了解,但是会在您输入的每个字符上触发。我希望在用户完成编辑时触发一个监听器。可能吗?同样在TextWatcher
中,我得到了Editable
的实例,但是我需要EditText
的实例。我怎么得到的?
EDIT:第二个问题更为重要。请回答。
首先,如果EditText
失去焦点,或者用户按下完成按钮(取决于您的实现方式和最适合您的方式),您可以查看用户是否完成了文本编辑。其次,仅当您将EditText
声明为实例对象时,才能在TextWatcher
中获得EditText
实例。即使您不应该在EditText
中编辑TextWatcher
,因为它并不安全。
编辑:
为了能够将EditText
实例放入您的TextWatcher
实现中,您应该尝试执行以下操作:
public class YourClass extends Activity {
private EditText yourEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
yourEditText = (EditText) findViewById(R.id.yourEditTextId);
yourEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
// you can call or do what you want with your EditText here
// yourEditText...
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
}
}
请注意,上面的示例可能有一些错误,但我只是想向您展示一个示例。
[困扰我的是,为所有EditText字段实现侦听器要求我使用难看的冗长代码,因此我编写了以下类。可能对绊倒这个的人有用。
public abstract class TextChangedListener<T> implements TextWatcher {
private T target;
public TextChangedListener(T target) {
this.target = target;
}
@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) {
this.onTextChanged(target, s);
}
public abstract void onTextChanged(T target, Editable s);
}
现在实现侦听器会更加干净。
editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
@Override
public void onTextChanged(EditText target, Editable s) {
//Do stuff
}
});
关于触发频率,也许可以在给定a之后执行检查以在//Do stuff
中运行所需的代码
使用黄油刀]的任何人。您可以使用:
@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {
}
我已经使用AutotextView
完成了它:
myTextBox.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {
TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);
myOutputBox.setText(s);
}
});
[TextWatcher
对我不起作用,因为它不断为每个EditText
触发并弄乱其他值。
据我所知,只有两种方法可以做到。您怎么知道用户已经写完一个单词?要么失去焦点,要么单击“确定”按钮。我没办法知道用户按下了最后一个字符...
Watcher方法将在每个字符输入上触发。因此,我基于onFocusChange方法构建了此代码: