zoukankan      html  css  js  c++  java
  • android UI-EditText的长度监听慎用TextWatcher

    在用户昵称的输入时,限定8个字符,本意是在输入超过8个时候,页面toast一个提示,就是下面的TextWatcher的监听,在afterTextChanged中处理。

    原bug:huawei MT2-C00提示数组越界crash,其他手机如红米小米荣耀HtcD820t都没问题。

     @Override
                 public void afterTextChanged(Editable s) {
                    editStart = mUsernameEditText.getSelectionStart();
                    editEnd = mUsernameEditText.getSelectionEnd();
                    if (temp.length() > 8) {
                         s.delete(editStart - 1, 0, editEnd);
                         showToast("昵称最多为8个字符");
                         int tempSelection = editStart;
                         mUsernameEditText.setText(s);
                         mUsernameEditText.setSelection(s.length());
                     }
                 }
             });
    View Code

    s.delete(editStart - 1, 0, editEnd);这一句的-1有问题,

    好吧,原来这样的写法确实存在越界的问题,增加一个和0的比较,但是parter说TextWatcher的监听在部分机型:huawei MT2-C00 Android4.4.2,以及三星(三星note3 Android4.4.2)的某些手机会报错,中英文混合输入等情况的判断并不是想要的结果,具体的原因和解决方法没有找到。

    只能删掉这个TextWatcher

     1         // 昵称最多为8个字符
     2         mUsernameEditText.addTextChangedListener(new TextWatcher() {
     3             private CharSequence temp;
     4             private int editStart;
     5             private int editEnd;
     6 
     7             @Override
     8             public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
     9                 temp = s;
    10             }
    11 
    12             @Override
    13             public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
    14             }
    15 
    16             @Override
    17             public void afterTextChanged(Editable s) {
    18                 editStart = mUsernameEditText.getSelectionStart();
    19                 editEnd = mUsernameEditText.getSelectionEnd();
    20                 if (temp.length() > 8) {
    21                     s.delete(Math.max(editStart - 1, 0), editEnd);
    22                     showToast("昵称最多为8个字符");
    23                     int tempSelection = editStart;
    24                     mUsernameEditText.setText(s);
    25                     mUsernameEditText.setSelection(s.length());
    26                 }
    27             }
    28         });
    View Code

    退而求其次,直接限制输入长度,不toast提示了,直接忽略第8个字符之后的输入。

    // 昵称最多为8个字符
    mUsernameEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(8)});

    以上只是简单的字符数目判断,不区分特殊字符和中英文,中英文每个字都算作一个字符。

    Android机型太多,还是保证了安全,牺牲了体验。

    以后有条件的话,huawei MT2-C00 Android4.4.2,以及三星(三星note3 Android4.4.2)要run一遍。

  • 相关阅读:
    网络编程学习笔记:Socket编程
    C# url 路径转换 相对路径 转换为 绝对路径
    利用pycharm运行scrapy以及scrapy的配置
    基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL
    LeetCode 1. Two Sum
    【转载】C#异常Retry通用类
    【转载】WebDriver(C#)之十点使用心得
    c#值类型和引用类型
    percona5.7 源码安装
    android UI进阶之用ViewPager实现欢迎引导页面[转]
  • 原文地址:https://www.cnblogs.com/permanent2012moira/p/4969539.html
Copyright © 2011-2022 走看看