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一遍。

posted @ 2015-11-16 17:28  Matrix_Ran  阅读(1628)  评论(0编辑  收藏  举报