今天碰到一个需求, EditText要求输入整数数字且要从1开始,不能输入0。
怎么搞?
1、先搞定只能输入整数数字
android:inputType="number"
这个属性,就是整数数字格式
常用属性,如下:
//文本类型,多为大写、小写和数字符号。
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"//URI格式
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="numberSigned"//有符号数字格式
android:inputType="numberDecimal"//可以带小数点的浮点格式
android:inputType="phone"//拨号键盘
android:inputType="datetime"//日期+时间格式
android:inputType="date"//日期键盘
android:inputType="time"//时间键盘
2、通过EditText的addTextChangedListener()方法,调用TextWatcher接口的三个方法中的after,来实现 EditText输入值从1开始,不能输入0。
edittext.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
if (s.toString().startsWith("0") || s.toString().equals("")) {
edittext.setText("1");
edittext.setSelection(1);
}
}
});
为什么我要放在after里呢。
before,on,after。
这三者。的关系是,我输入了文字,还未在edittext上显示;输入了文字,正在edittext上显示;和输入了文字,在edittext上显示出来了。这三个时刻,开始执行对应方法里的操作。
所以,如果我删除了后,我不操作了。那就是“”了。这个时候,我如果after里的代码是放在on里。那么,edittext将显示的是“”。这不符合我的要求。因此该放在after里。
3、为什么这么写after方法里的代码?
if (s.toString().startsWith("0")) {
edittext.setText("1");
edittext.setSelection(1);
}
既然输入的数字是从1开始,那我们就直接用startsWith()来判断是否是0带头,是则该修改为1;
要考虑到一点,就是两位以上的数字肯定是要从>=1的数字带头的,而不是0。
一个思路点注意:setText()是会调用before,on,after三个方法的哦。所以,你在这三个方法里写的内容不能变成死循环啦。
另一个思路点注意:光标,在我edittext.setText("1");后,我的光标是在设置的“1”之前的,所以,我们该怎么办。现有的方式是设置光标。即 edittext.setSelection(1)。设置光标在哪一个下标下,当然是在1啦。对不?在输入的首位数字的后面嘛。
分析一下需求如下:
edittext,默认为1。我可以删除1,键盘加个2,edittext变成2。
edittext,默认为1。我删除1,键盘加个0,edittext变成1。
edittext,默认为1。我删除1,键盘不加了,关闭键盘,edittext会变成1。
所以要满足这个靠那addTextChangedListener三个接口是不够的,所以还需要有个对Edittext值判断是否为“”的操作,而这个操作可以有很多方式,比如,软键盘弹出时监听,焦点是否消失监听,调用网络请求接口发出请求前,等等。所以这个就看个人喜好了。