Android中Edittext设置输入条件
作者:潘侯爷 发布时间:2023-03-11 23:05:08
一、应用场景
之前做商城应用时,会有对用户资料的设置情况进行限制,如下:
(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]"));
}
}
来源:http://www.cnblogs.com/panhouye/p/6821926.html


猜你喜欢
- 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者每天
- 前言定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行。但定时器线程池也还是线程池,最底层实现还是ThreadPoolEx
- 通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法。让你在多线程开发过程中的调试更加的有的放
- 1.使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面。重定向操作支持将地址重定向到不同的主机上,这
- 两种情况setState() 能在 build() 中直接调用吗?答案是能也不能。来看一段简单的代码:import 'package
- 这几年一直在做手机上和电视盒的App,几乎没有考虑过横竖屏切换的问题。电视盒好说,横屏不变,你要是给它设计个竖屏人家也没机会使;而手机上的应
- 前言在 上一节 Spring解密 - 默认标签的解析 中,重点分析了 Spring 对默认标签是如何解析的,那么本章继续讲解标签解析,着重讲
- 为了解决用一个命令(宏)给方法,类,js方法添加注释,经过几天的研究.终于得到结果了。实现的效果如下:给Java中的method添加方法:/
- 一、Shiro简介:Apache Shiro是一个Java的安全(权限)框架。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在J
- Java类之间的关系图在Java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们
- 一、select是什么select——>用于选择更快的结果。基于场景理解比如客户端要查询一个商
- 做一个五子棋练练手,没什么特别的,再复习一下自定义View的知识,onMeasure,MeasureSpec , onDraw以及OnTou
- 这篇文章主要介绍了Springboot整合Shiro的代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响。两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳 如果时间
- 公司的研发管理平台实现了Gitlab+Kubernetes的Devops,在ToB和ToC场景中,由于用户量大,且预发布环境和生产环境或多或
- 我在5月份的时候就申请了洞态IAST企业版内测,算是比较早的一批用户了。聊聊几个我比较在意的问题,比如API接口覆盖率、第三方开源组件检测以
- 这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下:思路如下:第一部分是
- 重新认识 Java 的 System.in以前也写过不少命令行的程序,处理文件时总需要通过参数指定路径,直到今天看资料时发现了一种我自己从来
- 话不多说,先看代码!/** * Created by david on 2017-7-5. */import com.google.gson
- ThreadLocal简介ThreadLocal 是 Java 中的一个线程本地存储机制,它允许每个线程拥有一个独立的本地存储空间