Android的编辑框控件EditText在平常编程时会经常用到,有时候会对编辑框增加某些限制,如限制只能输入数字,最大输入的文字个数,不能输入一些非法字符等,这些需求有些可以使用android控件属性直接写在布局xml文件里,比如android:numeric="integer"(只允许输入数字);

对于一些需求,如非法字符限制(例如不允许输入#号,如果输入了#给出错误提示),做成动态判断更方便一些,而且容易扩展;

在Android里使用TextWatcher接口可以很方便的对EditText进行监听;TextWatcher中有3个函数需要重载:

 public void beforeTextChanged(CharSequence s, int start,                                  int count, int after);    public void onTextChanged(CharSequence s, int start, int before, int count);    public void afterTextChanged(Editable s);

从函数名就可以知道其意思,每当敲击键盘编辑框的文字改变时,上面的三个函数都会执行,beforeTextChanged可以给出变化之前的内容,onTextChanged和afterTextChanged给出追加上新的字符之后的文本;

所以对字符的限制判断可以在afterTextChanged函数中进行,如果检查到新追加的字符为认定的非法字符,则在这里将其delete掉,那么他就不会显示在编辑框里了:

private final TextWatcher mTextWatcher = new TextWatcher() {    public void beforeTextChanged(CharSequence s, int start, int count, int after) {    }     public void onTextChanged(CharSequence s, int start, int before, int count) {    }     public void afterTextChanged(Editable s) {        if (s.length() > 0) {            int pos = s.length() - 1;            char c = s.charAt(pos);            if (c == '#') {//这里限制在字串最后追加#                s.delete(pos,pos+1);                Toast.makeText(MyActivity.this, "Error letter.",Toast.LENGTH_SHORT).show();            }        }    }};

注册监听:

EditText mEditor = (EditText)findViewById(R.id.editor_input);mEditor.addTextChangedListener(mTextWatcher);

android 中如何限制 EditText 最大输入字符数:

方法一:

在 xml 文件中设置文本编辑框属性作字符数限制

如:android:maxLength="10" 即限制最大输入字符个数为10


方法二:

在代码中使用InputFilter 进行过滤

//editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)}); 即限定最大输入字符数为20

[java] view plain copy print ?
  1. public class TextEditActivity extends Activity {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. EditText editText = (EditText)findViewById(R.id.entry);
  8. editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)});
  9. }
  10. }


方法三:

利用 TextWatcher 进行监听

[java] view plain copy print ?
  1. package cie.textEdit;
  2. import android.text.Editable;
  3. import android.text.Selection;
  4. import android.text.TextWatcher;
  5. import android.widget.EditText;
  6. /*
  7. * 监听输入内容是否超出最大长度,并设置光标位置
  8. * */
  9. public class MaxLengthWatcher implements TextWatcher {
  10. private int maxLen = 0;
  11. private EditText editText = null;
  12. public MaxLengthWatcher(int maxLen, EditText editText) {
  13. this.maxLen = maxLen;
  14. this.editText = editText;
  15. }
  16. public void afterTextChanged(Editable arg0) {
  17. // TODO Auto-generated method stub
  18. }
  19. public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
  20. int arg3) {
  21. // TODO Auto-generated method stub
  22. }
  23. public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
  24. // TODO Auto-generated method stub
  25. Editable editable = editText.getText();
  26. int len = editable.length();
  27. if(len > maxLen)
  28. {
  29. int selEndIndex = Selection.getSelectionEnd(editable);
  30. String str = editable.toString();
  31. //截取新字符串
  32. String newStr = str.substring(0,maxLen);
  33. editText.setText(newStr);
  34. editable = editText.getText();
  35. //新字符串的长度
  36. int newLen = editable.length();
  37. //旧光标位置超过字符串长度
  38. if(selEndIndex > newLen)
  39. {
  40. selEndIndex = editable.length();
  41. }
  42. //设置新光标所在的位置
  43. Selection.setSelection(editable, selEndIndex);
  44. }
  45. }
  46. }


对应的 activity 部分的调用为:

[java] view plain copy print ?
  1. package cie.textEdit;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.text.InputFilter;
  5. import android.widget.EditText;
  6. public class TextEditActivity extends Activity {
  7. /** Called when the activity is first created. */
  8. @Override
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. EditText editText = (EditText) findViewById(R.id.entry);
  13. editText.addTextChangedListener(new MaxLengthWatcher(10, editText));
  14. }
  15. }

限制输入字符数为10个

main.xml 文件

[html] view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <TextView
  6. android:id="@+id/label"
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="Type here:"/>
  10. <EditText
  11. android:id="@+id/entry"
  12. android:singleLine="true"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:background="@android:drawable/editbox_background"
  16. android:layout_below="@id/label"/>
  17. <Button
  18. android:id="@+id/ok"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:layout_below="@id/entry"
  22. android:layout_alignParentRight="true"
  23. android:layout_marginLeft="10dip"
  24. android:text="OK" />
  25. <Button
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:layout_toLeftOf="@id/ok"
  29. android:layout_alignTop="@id/ok"
  30. android:text="Cancel" />
  31. </RelativeLayout>


效果为输入了10个字符后,光标停在末尾



更多相关文章

  1. android之实现注册功能
  2. android 非系统APP访问字符设备
  3. Android(安卓)Lint分类及常见错误
  4. Android(安卓)EditText设置只能输入数字和小数点
  5. Android(安卓)Studio快捷键汇总
  6. Android如何判断当前字符串的组成情况(如:全由数字组成)
  7. Android数据加密之MD5加密
  8. android上实现蓝牙透传时遇到点问题
  9. Android中动态改变string.xml中的字符串

随机推荐

  1. android 手机拍照流程
  2. android 播放来电铃声
  3. 在Android(安卓)Service中弹出系统全屏对
  4. Android中使用log4j
  5. 一个简单android的全选,单选demo
  6. Android(安卓)Home键监听
  7. Android(安卓)studio下载与安装
  8. Android(安卓)-- 设置textview文字居中或
  9. unity在android显示界面(UnityPlayerActiv
  10. 利用Handler定时更新Android(安卓)UI