android 监听EditText 的变化

使用EditText的addTextChangedListener(TextWatcher watcher)方法对EditText实现监听,TextWatcher是一个接口类,所以必须实现TextWatcher里的抽象方法:

当EditText里面的内容有变化的时候,触发TextChangedListener事件,就会调用TextWatcher里面的抽象方法。
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
<EditText
    android:id="@+id/main_et" 
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content" /> 
<TextView
    android:id="@+id/main_tv" 
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content" /> 
</LinearLayout>
一、实现监听文本框字数,提示还能输入多少个字符
MainActivity:
package chay.mian;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

	private EditText editText;
	private TextView tip;
	private final int charMaxNum = 10; // 允许输入的字数

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
	}

	private void init() {
		editText = (EditText) findViewById(R.id.main_et);
		editText.addTextChangedListener(new EditChangedListener());
		
		tip = (TextView) findViewById(R.id.main_tv);
		tip.setText("0/"+charMaxNum);
	}

	class EditChangedListener implements TextWatcher {
		private CharSequence temp; // 监听前的文本
		private int editStart; // 光标开始位置
		private int editEnd; // 光标结束位置
		
		// 输入文本之前的状态
		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,int after) {
			temp = s;
		}

		// 输入文字中的状态,count是一次性输入字符数
		@Override
		public void onTextChanged(CharSequence s, int start, int before, int count) {
//			if (charMaxNum - s.length() <= 5) {
//				tip.setText("还能输入" + (charMaxNum - s.length()) + "字符");
//			}
			tip.setText((s.length()) + "/" + charMaxNum);
		}

		// 输入文字后的状态
		@Override
		public void afterTextChanged(Editable s) {
			/** 得到光标开始和结束位置 ,超过最大数后记录刚超出的数字索引进行控制 */
			editStart = editText.getSelectionStart();
			editEnd = editText.getSelectionEnd();
			if (temp.length() > charMaxNum) {
//				Toast.makeText(getApplicationContext(), "最多输入10个字符", Toast.LENGTH_SHORT).show();
				s.delete(editStart - 1, editEnd);
				editText.setText(s);
				editText.setSelection(s.length());
			}
		}
	};
}


二、数据类型检验,当输入不是整型数字的时候,会立刻弹出输入框,提示改正
MainActivity:

package chay.mian;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

	private EditText editText;
	private TextView tip;
	String str;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_mian);
		init();
	}

	private void init() {
		editText = (EditText) findViewById(R.id.mian_et);
		editText.addTextChangedListener(new EditChangedListener());
		tip = (TextView) findViewById(R.id.mian_tv);
		tip.setText("请输入整型数字");
	}

	class EditChangedListener implements TextWatcher {

		// 输入文本之前的状态
		@Override
		public void beforeTextChanged(CharSequence s, int start, int count, int after) {
			Log.d("TAG", "beforeTextChanged--------------->");
		}

		// 输入文字中的状态,count是一次性输入字符数
		@Override
		public void onTextChanged(CharSequence s, int start, int before, int count) {
			Log.d("TAG", "onTextChanged--------------->");
		}

		// 输入文字后的状态
		@Override
		public void afterTextChanged(Editable s) {
			Log.d("TAG", "afterTextChanged--------------->");
			str = editText.getText().toString();
			try {
//				if ((editText.getText().toString()) != null)
					Integer.parseInt(str);
			} catch (Exception e) {
				showDialog();
			}
		}
	};

	private void showDialog() {
		AlertDialog dialog;
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("消息").setIcon(android.R.drawable.stat_notify_error);
		builder.setMessage("你输出的整型数字有误,请改正");
		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
			}
		});
		dialog = builder.create();
		dialog.show();
	}
}

在LogCat查看调用这些方法的顺序:
beforeTextChanged-->onTextChanged-->onTextChanged


欢迎交流 http://blog.csdn.net/ycwol/article/details/46594275

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值