Android EditText限制输入字符的方法总结

发布时间 - 2026-01-11 02:27:11    点击率:

 Android EditText限制输入字符的方法总结

最近项目要求限制密码输入的字符类型, 例如不能输入中文。   现在总结一下EditText的各种实现方式,  以比较各种方法的优劣。

 第一种方式:  设置EditText的inputType属性,可以通过xml或者Java文件来设置。假如我要设置为显示密码的形式,可以像下面这样设置:

在xml中,   Android:inputType="textPassword"

在java文件中,可以用 ev.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

      inputType参数有phone、textPasswrod等等属性, 有兴趣的话可以测试一下。


第二种: 设置EditText的android:digits 属性, 这种方式可以指出要支持的字符。比如要限制只能输入数字和字母,可以这样:

        android:digits="0123456789abcdefghijklmnopqrstuvwxyz"。

PS:吐槽一下,写着好累,不支持区间操作符~或-

第三种: 使用TextWather监听EditText的字符变化, 当内容改变时删掉不想要的字符。说白了就是用户可以随便按键盘,在代码里马上删掉非法字符。 PS: 常见的搜索功能输入框就是用TextWatcher监测关键词变化,然后查数据并显示出来了。示例代码:只能输入字母或者数字, 如果要支持其它字符可以修改regEx正则表达式。

evPwd = (EditText) findViewById(R.id.ev_password);
evPwd.addTextChangedListener(new TextWatcher() {
  @Override
  public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

  }

  @Override
  public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    String editable = evPwd.getText().toString();
    String regEx = "[^a-zA-Z0-9]"; //只能输入字母或数字
    Pattern p = Pattern.compile(regEx);
    Matcher m = p.matcher(editable);
    String str = m.replaceAll("").trim();  //删掉不是字母或数字的字符
    if(!editable.equals(str)){
      evPwd.setText(str); //设置EditText的字符
      evPwd.setSelection(str.length()); //因为删除了字符,要重写设置新的光标所在位置
    }
  }

第四种:通过InputFilter来实现。实现InputFilter过滤器, 需要覆盖一个叫filter的方法。

public abstract CharSequence filter ( 
  CharSequence source, //输入的文字 
  int start, //开始位置 
  int end, //结束位置 
  Spanned dest, //当前显示的内容 
  int dstart, //当前开始位置 
  int dend //当前结束位置 
);

注意: IntentFilter是个数组, 也就是说可以写多个过滤条件!

下面的实现使得EditText只接收字符(数字、字母),Character.isLetterOrDigit会把中文也当做Letter, 所以要在写个正则判断是否中文。

evPwd.setFilters(new InputFilter[]{
  new InputFilter() {
    @Override
    public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
      String regex = "^[\u4E00-\u9FA5]+$";
      boolean isChinese = Pattern.matches(regex, charSequence.toString());
      if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese) {
        return "";
      }
      return null;
    }
  }
});

第五种:    使用EditText的InputConnection属性限制输入字符。 新建个类继承于EditText并覆盖onCreateInputConnection函数, 在xml里使用LimitText替换EditText。 

public class LimitEditText extends EditText {
  public LimitEditText(Context context) {
    super(context);
  }

  public LimitEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public LimitEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  /**
   * 输入法
   * @param outAttrs
   * @return
   */
  @Override
  public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    return new InnerInputConnecttion(super.onCreateInputConnection(outAttrs),
        false);
  }

  class InnerInputConnecttion extends InputConnectionWrapper implements InputConnection {

    public mInputConnecttion(InputConnection target, boolean mutable) {
      super(target, mutable);
    }

    /**
     * 对输入的内容进行拦截
     *
     * @param text
     * @param newCursorPosition
     * @return
     */
    @Override
    public boolean commitText(CharSequence text, int newCursorPosition) {
      // 只能输入字母或者数字
      if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese) {
        return false;
      }
      return super.commitText(text, newCursorPosition);
    }

    @Override
    public boolean sendKeyEvent(KeyEvent event) {
      return super.sendKeyEvent(event);
    }

    @Override
    public boolean setSelection(int start, int end) {
      return super.setSelection(start, end);
    }
  }
}



    以上是EditText输入限制的所有方法, 大家如有疑问,请留言或到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # EditText限制输入字符  # EditText限制输入字符的五种方法  # EditText  # Android EditText限制输入字数的方法  # Android编程中EditText限制文字输入的方法  # Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制(推荐)  # Android EditText限制输入字符类型的方法总结  # Android TextWatcher监控EditText中的输入内容并限制其个数  # Android EditText限制输入整数和小数的位数的方法示例  # Android最简单的限制输入方法(只包含数字、字母和符号)  # 关键词  # 是个  # 我要  # 多个  # 如有  # 可以用  # 要在  # 可以通过  # 希望能  # 有兴趣  # 重写  # 不支持  # 写着  # 会把  # 一个叫  # 用户可以  # 谢谢大家  # 说白了  # 设置为  # 来实现 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在Tomcat中配置并部署网站项目?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  香港服务器WordPress建站指南:SEO优化与高效部署策略  微信小程序 wx.uploadFile无法上传解决办法  Linux网络带宽限制_tc配置实践解析【教程】  如何用腾讯建站主机快速创建免费网站?  高防服务器租用指南:配置选择与快速部署攻略  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel如何发送系统通知?(Notification渠道示例)  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何在宝塔面板中创建新站点?  Java类加载基本过程详细介绍  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  JS弹性运动实现方法分析  实现点击下箭头变上箭头来回切换的两种方法【推荐】  北京网站制作的公司有哪些,北京白云观官方网站?  JS经典正则表达式笔试题汇总  Laravel如何使用Telescope进行调试?(安装和使用教程)  ,交易猫的商品怎么发布到网站上去?  如何确保西部建站助手FTP传输的安全性?  iOS发送验证码倒计时应用  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  nginx修改上传文件大小限制的方法  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel Docker环境搭建教程_Laravel Sail使用指南  如何在自有机房高效搭建专业网站?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Python高阶函数应用_函数作为参数说明【指导】  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Python并发异常传播_错误处理解析【教程】  在centOS 7安装mysql 5.7的详细教程  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Swift中swift中的switch 语句  php结合redis实现高并发下的抢购、秒杀功能的实例  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  MySQL查询结果复制到新表的方法(更新、插入)  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何在企业微信快速生成手机电脑官网?  详解Huffman编码算法之Java实现  Laravel如何与Pusher实现实时通信?(WebSocket示例)  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  javascript读取文本节点方法小结  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?