欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中Edittext设置输入条件

程序员文章站 2023-11-12 18:07:28
一、应用场景 之前做商城应用时,会有对用户资料的设置情况进行限制,如下: (1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号, (2)用户手机,应当只能输入数...

一、应用场景

之前做商城应用时,会有对用户资料的设置情况进行限制,如下:

(1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号,

(2)用户手机,应当只能输入数字,禁止输入其他字符。

(3)用户密码,应当不能输入空格以及中文字符等。

二、解决方案

针对用户邮箱以及用户手机,有以下两种解决方案:

(1)edittext中的android:digits属性:

它表示edittext能够接受的字符集合。通过配置此属性,就可以实现只允许输入指定的字符。这里列举上述三种场景下的android:digits配置。

场景一:只允许输入数字 android:digits="0123456789"

场景二:只允许输入数字和英文字母

android:digits="0123456789abcdefghigklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"

场景三:只允许输入数字,英文字母和@.两个符号

 android:digits="0123456789abcdefghigklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz@."

使用android:digits属性有几个需要注意的地方:

android:digits属性是隐藏的,无法直接在edittext的可视化属性列表中找到。只能直接在xml布局文件中配置。当在xml中增加了这项配置后,才可以在edittext的可视化属性列表中找到。

android:digits属性中的字符顺序没有影响,例如只允许输入数字时,可以用android:digits="0123456789",也可以用android:digits="9876543210"。

android:digits属性中允许有重复字符,有重复字符在使用效果上没有影响。例如android:digits="aaaaaa"和android:digits="aa"效果是一样的。

android:digits属性只能设置允许输入哪些字符,不能设置禁止输入哪些字符,也就是说android:digits属性只能设置白名单,不能设置黑名单。

(2)edittext中的android:inputtype属性:

带有中文输入法的手机,通常输入法会有三种类型的软键盘:中文键盘,英文键盘和数字键盘,不同键盘类型之间可以切换。虽然android:digits属性可以让edittext中只允许输入指定类型的字符,但并不能控制软键盘弹出时的类型。例如在设置android:digits只允许输入数字时,可能弹出的软键盘是英文键盘或中文键盘,需要用户点击切换到数字键盘后才可以输入;在设置android:digits只允许输入英文和数字时,可能弹出的软键盘是中文键盘,同样需要用户点击切换到英文键盘和数字键盘后才可以输入。如果能在软键盘显示时就直接跳到对应键盘类型,不需要用户切换就更好了。

当设置android:inputtype为number时,输入法开启时会自动切换到数字键盘。当设置为这里的其他几个选项时,输入法开启时会自动切换到英文字母键盘。这里列举上述三种场景下的android:inputtype配置。

场景一:只允许输入数字 android:inputtype="number"。实际上,当inputtype设置为number后,edittext中就只能输入数字了,那么android:digits="0123456789"也不用设置了。 如果android:inputtype="number"和android:digits同时设置,则实际可以输入的字符以android:digits配置为准。例如android:digits="01234567+-",则可以输入的字符为"01234567+-",这时如果同时设置了android:inputtype="number",可以达到自动切换到数字键盘的目的。

场景二:只允许输入数字和英文字母 android:inputtype="textvisiblepassword"。其他几个选项似乎都不太合适,textcapxxx的会有大小写的约束,textpassword显然只能用在密码输入框中,如果不介意软键盘中多几个符号,textemailaddress倒也可以用在这里。

场景三:只允许输入数字,英文字母和@.两个符号 android:inputtype="textemailaddress"。

三、使用正则以及重写textwatcher限制输入

下面通过代码演示通过此种方法设置不能输入空格以及中文字符等。

一般对edittext的操作及处理都是用addtextchangedlistener方法来对edittext进行监听,之后在监听方法中去做处理.这里也打算用这个种方法来做,大体的思路是监听edittext中输入的内容,然后将不是中文的部分清除掉,也就是置为空。

(1)首先我自定义textwatcher类

package com.example.panchengjia.limittext;
import android.text.editable;
import android.text.textwatcher;
import android.widget.edittext;

/**
 * created by panhouye on 2017/5/7 0007.
 */

public class limitinputtextwatcher implements textwatcher {
  /**
   * et
   */
  private edittext et = null;
  /**
   * 筛选条件
   */
  private string regex;
  /**
   * 默认的筛选条件(正则:不能输入中文和空格)
   * \u4e00-\u9fa5匹配中文\u0020匹配空格
   */
  private string default_regex = "[\u4e00-\u9fa5\u0020]";

  /**
   * 构造方法
   *
   * @param et
   */
  public limitinputtextwatcher(edittext et) {
    this.et = et;
    this.regex = default_regex;
  }

  /**
   * 构造方法
   *
   * @param et  et
   * @param regex 筛选条件
   */
  public limitinputtextwatcher(edittext et, string regex) {
    this.et = et;
    this.regex = regex;
  }

  @override
  public void beforetextchanged(charsequence charsequence, int i, int i1, int i2) {

  }

  @override
  public void ontextchanged(charsequence charsequence, int i, int i1, int i2) {

  }

  @override
  public void aftertextchanged(editable editable) {
    string str = editable.tostring();
    string inputstr = clearlimitstr(regex, str);
    et.removetextchangedlistener(this);
    // et.settext方法可能会引起键盘变化,所以用editable.replace来显示内容
    editable.replace(0, editable.length(), inputstr.trim());
    et.addtextchangedlistener(this);

  }
  /**
   * 清除不符合条件的内容
   *
   * @param regex
   * @return
   */
  private string clearlimitstr(string regex, string str) {
    return str.replaceall(regex, "");
  }
}

(2)activity中的实现代码

package com.example.panchengjia.limittext;

import android.support.v7.app.appcompatactivity;
import android.os.bundle;
import android.widget.edittext;

public class mainactivity extends appcompatactivity {
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    edittext et = (edittext) findviewbyid(r.id.et);
    //使用limitinputtextwatcher中默认的输入规则
    et.addtextchangedlistener(new limitinputtextwatcher(et));
    edittext ett = (edittext) findviewbyid(r.id.ett);
    //设置只能输入中文
    ett.addtextchangedlistener(new limitinputtextwatcher(ett,"[^\u4e00-\u9fa5]"));
  }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!