焦点改变监听:setOnFocusChangeListener
这个监听比较实用,尤其是在页面中有多个文本,并且要对部分文本进行有效验证的时候。
简单示例如下:
Java代码
signWords.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){//获得焦点
//在这里可以对获得焦点进行处理
}else{//失去焦点
//在这里可以对输入的文本内容进行有效的验证
}
}
});
以上的这个监听有一个弊端,就是如果页面只有一个EditText,该EditText一旦获得焦点就不会再失去焦点。这是个比较让人头痛的问题。想在此时进行有效的验证恐怕是很难做到的。
文本内容改变监听:addTextChangedListener
这个监听是在EditText的文本内容发生改变的时候进行触发的。触发的频率比上面的监听要高得多。所以一般不建议使用。如果你有特殊的需求,使用起来也是挺方便的。
简单的示例如下:
Java代码
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) {
}
});
以下是调用的任务及监听事件
Java代码
/**
* 根据语音搜索用户任务
*
* @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
Xml代码
<LinearLayout
android:id="@+id/ll_focus"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="0px"/>