EditText 文本焦点事件

焦点改变监听: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"/>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值