焦点改变监听:setOnFocusChangeListener
这个监听比较实用,尤其是在页面中有多个文本,并且要对部分文本进行有效验证的时候。
简单示例如下:
signWords.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){//获得焦点 //在这里可以对获得焦点进行处理 }else{//失去焦点 //在这里可以对输入的文本内容进行有效的验证 } } });
以上的这个监听有一个弊端,就是如果页面只有一个EditText,该EditText一旦获得焦点就不会再失去焦点。这是个比较让人头痛的问题。想在此时进行有效的验证恐怕是很难做到的。
文本内容改变监听:addTextChangedListener
这个监听是在EditText的文本内容发生改变的时候进行触发的。触发的频率比上面的监听要高得多。所以一般不建议使用。如果你有特殊的需求,使用起来也是挺方便的。
简单的示例如下:
signWords.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(start>0&& CommonUtils.matchString(checkAllow, String.valueOf(true))&& CommonUtils.matchString(signAttr, "sureAllowName")){//工作许可人 System.out.println("changed:"+s); TaskParams params = new TaskParams(); params.put("searchNames", String.valueOf(s)); UserSearchTask task = new UserSearchTask(); task.setListener(tuserSearchTaskListener); task.execute(params); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } });
以下是调用的任务及监听事件
/** * 根据语音搜索用户任务 * * @author lihua */ private class UserSearchTask extends GenericTask { @Override protected String _doInBackground(TaskParams... params) { try { return getApi().getSearchUserByNames( params[0].getString("searchNames")); } catch (HttpException e) { e.printStackTrace(); return "error"; } } } /** * 搜索用户任务监听 */ private TaskListener tuserSearchTaskListener = new TaskAdapter() { @Override public void onPostExecute(GenericTask task, String result) { try { JSONObject object = new JSONObject(result); if("true".equals(object.getString("success"))){ sysUserId = object.getString("sysUserId"); signWords.setText(object.getString("fullName")); }else{ //Toast.makeText(getApplicationContext(), "未找到相符的工作人员姓名", Toast.LENGTH_LONG).show(); } } catch (JSONException e) { e.printStackTrace(); } } @Override public String getName() { return "Login"; } };
如果一个Activity或Dialog中就一个EditText,而不想在打开该Activity或Dialog时将焦点设置在EditText中。这里提一点,如果页面中有EditText,系统会默认将焦点移到第一个EditText上。可以采取如下方式:
在对应的XML文件中放置一个没有任何内容的LinearLayout