当我们需要对一个编辑框进行一定的限制,比如禁止输入某个字符,禁止错误的的格式等之类的操作时,就有必要用到EditText的时时监听,而TextWatcher就提供了这种功能。
详情请看下边的事例:
1. implements TextWatcher接口,重写相应的三个方法
2..在 void beforeTextChanged(CharSequence s, int start, int count,int after) { }
void onTextChanged(CharSequence s, int start, int before,int count) { }
void afterTextChanged(Editable s) { }中做操作
3. 给你的EditText 添加监听 et_keyword.addTextChangedListener(new editListener());
例如,下边是一个只允许输入整型和浮点型数字的实例
android:inputType="numberDecimal"//默认调取数字键盘
android:digits=".0123456789"//允许输入的字符
//由于已经在布局文件中对EditText设置了一定的属性限制
所以只能输入.0123456789等字符
public class MainActivity extends Activity {
EditText et_keyword;
Button go;
int scount;
int sstart;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_keyword = (EditText)findViewById(R.id.et_keyword);
go = (Button)findViewById(R.id.go);
et_keyword.addTextChangedListener(new editListener());
go.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//禁止最后一位为小数点 如: 300. 是错误格式,不允许提交
if(et_keyword.getText()!= null){
String s = et_keyword.getText().toString().trim();
if(".".equals(String.valueOf(s.charAt(s.length()-1)))){
Toast.makeText(MainActivity.this, "请输入正确的数据格式", 1).show();
}else{
Toast.makeText(MainActivity.this, "成功", 1).show();
}
}
}
});
}
class editListener implements TextWatcher{
/**This method is called to notify you that, within s, the count characters
* beginning at start are about to be replaced by new text with length after.
* 在s中,从start处开始的count个字符将要被长度为after的文本替代
* s 为变化前的内容;
* start 为开始变化位置的索引,从0开始计数;
* count 为将要发生变化的字符数 ,比如s由1变为12,count为0,由12变为1,count为1;
* after 为用来替换旧文本的长度,比如s由1变为12,after为1,由12变为1,after为0;
*/
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
/**
* This method is called to notify you that, within s, the count characters
* beginning at start have just replaced old text that had length before
* 在s中,从start处开始的count个字符刚刚替换了原来长度为before的文本
* s 为变化后的内容;
* start 为开始变化位置的索引,从0开始计数;
* before 为被取代的老文本的长度,比如s由1变为12,before为0,由12变为1,before为1;
* count 为将要发生变化的字符数
*/
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
//此方法中可以把count理解为1为输入一个字符,0为删除一字符
scount = count;
sstart = start;
}
/**
* This method is called to notify you that, somewhere within s, the text has been changed.
*/
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
Log.e("@@", "afterTextChanged---"+s);
if(scount == 1){
//第一位禁止输入小数点
if(sstart == 0 && ".".equals(s.subSequence(sstart, sstart+1).toString())){
s.delete(sstart, sstart+1);
et_keyword.setText(s);
et_keyword.setSelection(s.length());
Toast.makeText(MainActivity.this, "请输入正确的数字格 式!",Toast.LENGTH_SHORT).show();
}
}
}
}
代码地址 :http://download.csdn.net/detail/userzhanghao123/7013163