今天碰到一个需求, 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值判断是否为“”的操作,而这个操作可以有很多方式,比如,软键盘弹出时监听,焦点是否消失监听,调用网络请求接口发出请求前,等等。所以这个就看个人喜好了。

更多相关文章

  1. android软键盘的隐藏以及Edittext的焦点问题
  2. Android图像格式类及图像转换方法
  3. CyanogenMod 10 修改 Vold 使 Android 自动挂载 NTFS 和 exFAT

随机推荐

  1. Java反射---getGenericSuperclass和Param
  2. java中循环遍历删除List和Set集合中元素
  3. getter on xmlbeans生成的类返回null,它不
  4. 如何从webview获取javascript值到android
  5. 当只使用get()和set()方法时,用原始类型替换At
  6. 蓝桥杯 ALGO-53 算法训练 最小乘积(基本
  7. 关于LSA的相关学习---短文本聚类涉及到的
  8. 理顺 JavaScript (12) - 一个比较实用的
  9. 请问用Java如何逐行的读取一个文本文件呀
  10. web基础之自动处理表单填装javabean