EditText中对本身修改的方法

此篇为复制内容

需要在EditText中对输入的身份证号进行分段显示,例如:123456789012345678 显示为123456 7890 1234 5678,我的做法是

etIDCard.addTextChangedListener(new IDCardNumberWatcher()); //身份证输入框,没有做数字限制,因为身份证号有可能存在字母

class IDCardNumberWatcher implements TextWatcher {

      public void beforeTextChanged(CharSequence s, int start, int count,    
              int after) {    

      }    

      public void onTextChanged(CharSequence s, int start, int before,    
              int count) {    

      }    

      public void afterTextChanged(Editable editable) {    
         edIDCard.removeTextChangedListener(this);//先移除监听,再设置文本,否则会无限死循环  
         edIDCard.setText(getFormatIDCard(editable.toString()));//对输入框文本进行分段显示  
         etIDCard.<span style="color:black;">addTextChangedListener(this); //再次添加监听,监听用户输入动作</span>  

} }

/**
*对文本进行分段显示,例如:123456789012345678 显示为123456 7890 1234 5678
*/
private String getFormatIDCard(String str){
String result = null;
//处理过程省略
return result;
}

上面的代码看似完美,可以实现想要的效果,呵呵哒,这只是背景介绍。下面看问题。

问题:
如果手机默认的输入法是谷歌输入法(被老大坑的前奏,其他输入法没这事啊),那么用户体验是这样的:
因为没有做数字限制,那么该输入框可以输入数字、字母、中文等等,也即键盘输入法可以切换到数字盘和字母盘或其他,那么如果对EditText做了以上代码监听,当谷歌键盘用户切换到数字盘输入一个数字后,哦豁,键盘模式自动由数字盘切换回默认的字母盘。

一句话:每次在数字盘输入一个数字,键盘就自动切换到字母盘。

原因:
经过一句一句的注释后运行测试,发现问题出在afterTextChanged里面的setText,每次setText后,键盘布局就发生改变
ok,不能setText来达到目的,那么想个其他方式吧:

解决:
将afterTextChanged中的setText语句修改为:

[java] view plain copy print?
editable.replace(0,editable.length,getFormatIDCard(editable.toString()));

2.在TextWatcher(EditText输入监听) 中如果要对EditText进行setText,那么切记要先removeTextChangedListener再setText,然后再addTextChangedListener,否则会在setText时出现无限死循环,导致StackOverFlow

    TextWatcher textWatcher = 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) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            if (editable.toString().trim().length() > 0 && !editable.toString().trim().substring(0, 1).equals("0")) {
                jine = editable.toString().trim();
            } else {
                reward_zidingyi_edit.removeTextChangedListener(this);//先移除监听,再设置文本,否则会无限死循环
                reward_zidingyi_edit.setText("");
                reward_zidingyi_edit.addTextChangedListener(textWatcher);
                jine = "";
            }
        }
    };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: EditText是Android的一个UI组件,用于接收和显示用户输入的文本信息。它提供了一系列方法用于操作和获取EditText的属性,其一些常用的方法如下: 1. setText(CharSequence text):设置EditText显示的文本内容。 2. getText():获取EditText的文本内容。 3. setHint(CharSequence hint):设置EditText未输入内容时的提示信息。 4. setSelection(int index):设置EditText光标所在的位置。 5. addTextChangedListener(TextWatcher watcher):为EditText添加文本变化的监听器。 6. setOnEditorActionListener(TextView.OnEditorActionListener listener):为EditText设置编辑器操作的监听器。 7. setEnabled(boolean enabled):设置EditText是否可用。 以上仅是一部分常用的方法EditText还有很多其他的方法可以使用。 ### 回答2: EditText是Android开发常用的一个控件,主要用于接收用户的输入。 1. getText():获取EditText的文本内容 方法说明:返回一个Editable类型的对象,表示EditText的文本内容 2. setText():设置EditText的文本内容 方法说明:接收一个CharSequence类型的参数,并将其作为EditText的文本内容进行显示 3. setSelection():设置EditText文本的选区域 方法说明:接收两个参数,分别表示选文本的起始位置和结束位置,将这段文本在EditText变为选状态 4. append():在EditText的内容后追加文本 方法说明:接收一个CharSequence类型的参数,并将其追加到EditText原有的文本内容后面 5. addTextChangedListener():为EditText添加文本变化监听器 方法说明:接收一个TextWatcher类型的参数,用于监听EditText文本内容的变化 6. setHint():设置EditText的提示文本 方法说明:接收一个CharSequence类型的参数,用于设置EditText的提示文本,在用户输入之前显示在控件上 7. setInputType():设置EditText的输入类型 方法说明:接收一个InputType类型的参数,用于设置EditText接收用户输入的类型,如数字、电话、邮箱等 8. requestFocus():获取EditText焦点 方法说明:设置EditText为焦点状态,允许用户输入的控件会自动获取焦点 9. setEnabled():设置EditText是否可编辑 方法说明:接收一个boolean类型的参数,用于设置EditText是否可以编辑。当设置为false时,EditText将无法接收用户的输入。 以上是EditText的一些常用方法和简单的文说明,通过这些方法,可以实现对EditText的各种操作和设置。 ### 回答3: EditText是Android开发常用的一个控件,用于接收和显示用户输入的文本。下面是EditText的常用方法及其文说明: 1. setText(CharSequence text):设置EditText显示的文本内容。 2. getText():获取EditText当前显示的文本内容。 3. setHint(CharSequence hint):设置EditText的提示文本,当EditText没有输入时显示。 4. setEnabled(boolean enabled):设置EditText是否可用。 5. setFocusable(boolean focusable):设置EditText是否可以获得焦点。 6. setFocusableInTouchMode(boolean focusableInTouchMode):设置EditText是否可以在触摸模式下获得焦点。 7. addTextChangedListener(TextWatcher watcher):添加文本监听器,用于监听EditText文本的变化。 8. setSelection(int index):设置EditText文本的选范围。 9. setCursorVisible(boolean visible):设置是否显示光标。 10. setInputType(int type):设置EditText的输入类型,例如数字、电话号码、密码等。 11. setTransformationMethod(TransformationMethod method):设置EditText文本的转换方式,例如隐藏密码。 12. setOnEditorActionListener(TextView.OnEditorActionListener listener):设置监听EditText软键盘的动作事件。 13. setFilters(InputFilter[] filters):设置输入过滤器,限制输入字符的类型和长度。 14. setError(CharSequence error):设置错误提示信息,当用户输入不符合要求时显示错误提示。 15. setOnFocusChangeListener(View.OnFocusChangeListener listener):设置焦点改变监听器,用于监听EditText的焦点变化。 16. requestFocus():请求EditText获取焦点。 这些方法可以帮助我们控制和自定义EditText的行为和外观,使其能够更好地满足我们的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值