android edittext onchange监听器

我对TextWatcher有一点了解,但是对于你input的每个字符都会触发。 我想要一个侦听器,只要用户完成编辑就会触发。 可能吗? 另外在TextWatcher我得到了一个Editable的实例,但是我需要一个EditText的实例。 我如何得到这个?

编辑 :第二个问题更重要。 请回答。

首先,如果EditText失去焦点或者用户按下完成button(这取决于您的实现以及适合您的最佳select),您可以查看用户是否完成了编辑文本。 其次,只有在将EditText声明为实例对象的情况下,才能在textwatcher中获得EditText实例。 即使你不应该在textwatcher编辑EditText ,因为它不安全。

编辑:

为了能够将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) {} }); } } 

请注意,上面的示例可能有一些错误,但我只是想告诉你一个例子。

任何人使用ButterKnife 。 你可以使用像:

 @OnTextChanged(R.id.zip_code) void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) { } 

这让我困扰,为我的所有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 } }); 

至于如何经常触发,可能会执行一个检查来运行他们想要的代码//Do stuff在给定的a之后//Do stuff

我已经使用AutotextView完成了它:

 AutotextView textView = (AutotextView) findViewById(R.id.autotextview); textView.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { seq = cs; } @Override public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) { } @Override public void afterTextChanged(Editable arg0) { new SearchTask().execute(seq.toString().trim()); } }); 

TextWatcher没有为我工作,因为它保持每个EditText触发,并搞乱了每个人的价值观。

这是我的解决scheme:

 public class ConsultantTSView extends Activity { ..... //Submit is called when I push submit button. //I wanted to retrieve all EditText(tsHours) values in my HoursList public void submit(View view){ ListView TSDateListView = (ListView) findViewById(R.id.hoursList); String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString(); } } 

因此,通过使用getChildAt(xx)方法,您可以检索ListView任何项目,并使用findViewById获取单个项目。 然后它会提供最近的价值。

  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); } }); 

就我所能想到的而言,只有两种方法可以做到。 你怎么知道用户完成了一个单词? 无论焦点丢失,还是点击“确定”button。 我不知道用户按下了最后一个字符

所以调用onFocusChange(View v, boolean hasFocus)或者添加一个button和一个点击监听器。