Edittext限制字符输入和属性介绍
一.这里先展示一个小例子:
让Edittext只能输入:192.168.1…//这种数字和小数点的符号,并且显示的虚拟键盘是数字的(一般左边都有小数点)
只要这样设置Edittext的布局就可以了
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:digits="123456789."//可以输入的字符
/>
上面inputType是设置显示虚拟键盘的样式,digits是限制输入的字符,这里如果没有digits,设置了inputType:number后只能输入数字!
这里我测试过了digits也可以添加中文或其他字符。
二.EditText限制输入字符的5种实现方式
1. 设置EditText的inputType属性,可以通过xml或者java文件来设置。
假如我要设置为显示密码的形式,可以像下面这样设置:
//在xml中,
android:inputType="textPassword"
在java文件中,可以用
Edittext.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
2. 设置EditText的android:digits 属性, 这种方式可以指出要支持的字符。
比如要限制只能输入数字和字母,可以这样:
android:digits="0123456789abcdefghijklmnopqrstuvwxyz@#!."。//不支持区间操作符~或-
3.使用TextWather监听EditText的字符变化, 当内容改变时删掉不想要的字符。
说白了就是用户可以随便按键盘,在代码里控制马上删掉非法字符。
PS: 常见的搜索功能输入框就是用TextWatcher监测关键词变化,然后查数据并显示出来了。
示例代码:只能输入字母或者数字, 如果要支持其它字符可以修改regEx正则表达式。
Edittext et = (EditText) findViewById(R.id.ev_password);
//Edittext有字符变化的回调监听
et.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 = et.getText().toString();//获取Edittext上的字符串
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)){
et.setText(str); //设置EditText的字符
et.setSelection(str.length()); //因为删除了字符,要重写设置新的光标所在位置
}
}
4.通过InputFilter来实现。实现InputFilter过滤器, 需要覆盖一个叫filter的方法。
EditText et=findViewById(R.id.et);
et.setFilters(new InputFilter[]{
new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String regex = "^[\u4E00-\u9FA5]+$";
boolean isChinese = Pattern.matches(regex, source.toString());
if (!Character.isLetterOrDigit(source.charAt(start)) || isChinese) {
return "";
}
return null;
}
}
});
上面这个方法也是能实现,设置Edittext只能输入数字和字母,但是具体原理,我也没怎么理解!
注意: IntentFilter是个数组, 也就是说可以写多个过滤条件InputFilter!
这里也给大家简单说一下正则表达式:
/^(\w|-|[\u4E00-\u9FA5])*$/
^ 以后面的为开头
$ 以前面的为结尾
\w 数字,字母,下划线,.
\u4E00-\u9FA5 中文
* 代表前面出现0次或多次
| 或者
所以整个的意思是匹配一个 数字,字母,下划线,-,.,中文组成的一个字串
上面如果要不能输入1和中文字符,那么这这样写:
String regex = "^1|[\u4E00-\u9FA5]+$";//同理你要限制其他字符用“|”即可。
正则表达式的筛选条件字符串,并非都是要^开头,$结尾。
如果想详细理解一下正则表达式,可以看看我之前的一个博客:
http://blog.csdn.net/wenzhi20102321/article/details/52627482
5.使用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);
}
}
}
在布局文件中使用自定义View记得添加包名!
三、顺便介绍一下xml的inputtype的值。
android:inputType=”none”
android:inputType=”text”
android:inputType=”textCapCharacters” 字母大写
android:inputType=”textCapWords” 首字母大写
android:inputType=”textCapSentences” 仅第一个字母大写
android:inputType=”textAutoCorrect” 自动完成
android:inputType=”textAutoComplete” 自动完成
android:inputType=”textMultiLine” 多行输入
android:inputType=”textImeMultiLine” 输入法多行(如果支持)
android:inputType=”textNoSuggestions” 不提示
android:inputType=”textUri” 网址
android:inputType=”textEmailAddress” 电子邮件地址
android:inputType=”textEmailSubject” 邮件主题
android:inputType=”textShortMessage” 短讯
android:inputType=”textLongMessage” 长信息
android:inputType=”textPersonName” 人名
android:inputType=”textPostalAddress” 地址
android:inputType=”textPassword” 密码
android:inputType=”textVisiblePassword” 可见密码
android:inputType=”textWebEditText” 作为网页表单的文本
android:inputType=”textFilter” 文本筛选过滤
android:inputType=”textPhonetic” 拼音输入
//数值类型
android:inputType=”number” 数字格式-->显示数字键盘,并且只能收入数字,不能输入任何字母中文符号
android:inputType="numberPassword" 密码数字格式-->显示纯数字键盘,并且只能收入数字,不能输入任何字母中文符号,一秒内屏蔽数字
android:inputType=”numberSigned” 带符号数字格式-->显示数字键盘,能在开头输入一个"-"表示负数,其他位置和number属性一样,只能输入数字
android:inputType=”numberDecimal” 带小数点的浮点格式-->显示数字键盘,输入浮点数,只能有一个点号"."
android:inputType=”phone” 拨号键盘-->显示数字键盘,能输入数字和四个符号:"+-*/"
android:inputType=”datetime” 时间日期-->显示数字键盘,能输入数字和三个符号:"/-:"
android:inputType=”date” 日期键盘-->显示数字键盘,能输入数字和两个符号:"/-"
android:inputType=”time” 时间键盘-->显示数字键盘,能输入数字和两个符号:"/:"
这里那么多属性值,没必要都记住
我这里给大家总结一下经验(刚测试的):
如果要显示数字的虚拟键盘:
使用:android:inputType=”number”
如果需要一些特殊的字符可以加上去:android:digits=”123456789(一些字符如.+-)”
日期,时间那些Type也可满足要求
默认情况,一般都是显示那种九宫格的,拼音输入法(一般是手机系统设置决定)
如果要显示字母键盘的形式:
使用:android:inputType=”textEmailAddress”或android:inputType=”textUri”。。。
如果要显示数字+字母键盘的形式:
使用:android:inputType=”textVisiblePassword”
如果要输入的是密码类型的数据:
使用:android:inputType=”textPassword”
上面这个的密码可以有数字英文符号
如果只是单纯的数字密码,使用:android:inputType=”numberPassword”
四、介绍edittext其他常用属性,网络收集的。
android:layout_gravity="center_vertical" 设置控件显示的位置:默认top,这里居中显示,
android:hint="请输入数字!"设置显示在空间上的提示信息
android:numeric="integer" 设置只能输入整数,如果是小数则是:decimal
android:singleLine="true" 设置单行输入,一旦设置为true,则文字不会自动换行。
android:password="true" 设置只能输入密码
android:textColor = "#ff8c00" 字体颜色
android:textStyle="bold" 字体,bold, italic, bolditalic
android:textSize="20dip" 大小
android:capitalize = "characters" 以大写字母写
android:textAlign="center" EditText没有这个属性,
android:textColorHighlight="#cccccc" 被选中文字的底色,默认为蓝色
android:textColorHint="#ffff00" 设置提示信息文字的颜色,默认为灰色
android:textScaleX="1.5" 控制字与字之间的间距
android:typeface="monospace" 字型,normal(普通字体,系统默认使用的字体), sans(非衬线字体), serif(衬线字体), monospace(等宽字体)
android:background="@null" 空间背景,这里没有,指透明,并且隐藏下划线
android:layout_weight="1" 权重,控制控件之间的地位,在控制控件显示的大小时蛮有用的。
android:textAppearance="?android:attr/textAppearanceLargeInverse" 文字外观,这里引用的是系统自带的一个外观,
?表示系统是否有这种外观,否则使用默认的外观。不知道这样理解对不对?
//通过EditText的layout xml文件中的相关属性来实现:
1. 密码框属性 android:password="true" 这条可以让EditText显示的内容自动为星号,输入时内容会在1秒内变成*字样。
2. 纯数字 android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入
3. 仅允许 android:capitalize="cwj1987" 这样仅允许接受输入cwj1987,一般用于密码验证 下面是一些扩展的风格属性
android:editable="false" 设置EditText不可编辑
android:singleLine="true" 强制输入的内容在单行
android:ellipsize="end" 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时
虽然这些都是很简单,但也很常用。有些属性我们可能不熟悉,有些可能也是有些作用的,多了解一些是好的。