在用户昵称的输入时,限定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()); } } });
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 });
退而求其次,直接限制输入长度,不toast提示了,直接忽略第8个字符之后的输入。
// 昵称最多为8个字符
mUsernameEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(8)});
以上只是简单的字符数目判断,不区分特殊字符和中英文,中英文每个字都算作一个字符。
Android机型太多,还是保证了安全,牺牲了体验。
以后有条件的话,huawei MT2-C00 Android4.4.2,以及三星(三星note3 Android4.4.2)要run一遍。