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和一个点击监听器。