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());
}
}
});
s.delete(editStart - 1, 0, editEnd);这一句的-1有问题,
好吧,原来这样的写法确实存在越界的问题,增加一个和0的比较,但是parter说TextWatcher的监听在部分机型:huawei MT2-C00 Android4.4.2,以及三星(三星note3 Android4.4.2)的某些手机会报错,中英文混合输入等情况的判断并不是想要的结果,具体的原因和解决方法没有找到。
只能删掉这个TextWatcher
// 昵称最多为8个字符
mUsernameEditText.addTextChangedListener(new TextWatcher() {
private CharSequence temp;
private int editStart;
private int editEnd; @Override
public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
temp = s;
} @Override
public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
} @Override
public void afterTextChanged(Editable s) {
editStart = mUsernameEditText.getSelectionStart();
editEnd = mUsernameEditText.getSelectionEnd();
if (temp.length() > 8) {
s.delete(Math.max(editStart - 1, 0), editEnd);
showToast("昵称最多为8个字符");
int tempSelection = editStart;
mUsernameEditText.setText(s);
mUsernameEditText.setSelection(s.length());
}
}
});
退而求其次,直接限制输入长度,不toast提示了,直接忽略第8个字符之后的输入。
// 昵称最多为8个字符
mUsernameEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(8)});
以上只是简单的字符数目判断,不区分特殊字符和中英文,中英文每个字都算作一个字符。
Android机型太多,还是保证了安全,牺牲了体验。
以后有条件的话,huawei MT2-C00 Android4.4.2,以及三星(三星note3 Android4.4.2)要run一遍。
android UI-EditText的长度监听慎用TextWatcher的更多相关文章
- Android EditText截获与监听输入事件
Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyLi ...
- android BroadcastReceiver ACTION_TIME_TICK 系统时间监听不到
android BroadcastReceiver ACTION_TIME_TICK 系统时间监听不到 今天做android上的消息推送,启动了一个独立service,然后在里面监听系统的ACTION ...
- android的Home键的监听封装工具类(一)
android的Home键的监听封装: package com.gzcivil.utils; import android.content.BroadcastReceiver; import andr ...
- Android EditText的输入监听,输入字符的动态获取
http://itindex.net/detail/38974-android-edittext-%E7%9B%91%E5%90%AC 有时候我们可能会用到时时的监听EditText输入字符的时时监听 ...
- Android开发 ---基本UI组件5:监听下拉选项,动态绑定下拉选项、全选/反选,取多选按钮的值,长按事件,长按删除,适配器的使用,提示查询数据,activity控制多按钮
效果图: 效果描述: 1.当点击 1 按钮后,进入选择城市的页面,会监听到你选中的城市名称:动态为Spinner绑定数据 2.当点击 2 按钮后,进入自动查询数据页面,只要输入首字母,就会动态查找以该 ...
- 【转】Android开发20——单个监听器监听多个按钮点击事件
原文网址:http://woshixy.blog.51cto.com/5637578/1093936 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律 ...
- Android 关于在Activity中监听ListView
Android 开发时,最常用的控件之一就是ListView了,而使用ListView的同时,必然需要对它设置监听器,常用的监听器有这么几个: 1. OnItemClickListener // 监听 ...
- Android开发入门——Button绑定监听事件三种方式
import android.app.Activity; import android.os.Bundle;import android.view.View;import android.widget ...
- EditText中onEditorAction监听事件执行两次
Android的EditText通过setOnEditorActionListener给文本编辑框设置监听事件,但是在其处理方法onEditorAction中的逻辑在每次回车后都触发了两次, 原来是在 ...
随机推荐
- C++多字节字符转换为宽字符的两种方法
目前知道有两种方式:可以提供宽字符与ANSI字符之间的转换, 第一种由COM库提供的函数 char* _com_util::ConvertBSTRToString(BSTR ); BSTR _com ...
- ME525+ 刷机工具及设置中心号码
接上篇: 刷机包下载地址http://sbf.droid-developers.org/umts_jordanplus/list.php,选择一款大陆包.... 设置中心号码: 拨打 *#*#46 ...
- Python 操作 MySQL--(pymysql)
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- POJ 1753 Flip Game (DFS + 枚举)
题目:http://poj.org/problem?id=1753 这个题在開始接触的训练计划的时候做过,当时用的是DFS遍历,其机制就是把每一个棋子翻一遍.然后顺利的过了.所以也就没有深究. 省赛前 ...
- oracle数据库导出并重新导入
斌斌 (给我写信) 原创博文(http://blog.csdn.net/binbinxyz),转载请注明出处! 一.导出数据库 1.将数据库TEST完全导出,用户名scott密码tiger,导出到D: ...
- mount CIFS return ERR -12 and report Cannot allocate memory
When I mount CIFS on board, it encountered error as below: # mount -t cifs //192.168.1.28/98share /t ...
- 错误:C:\Windows\System32\ssleay32.dll: Can't load IA 32-bit .dll on a AMD 64-bit
错误:C:\Windows\System32\ssleay32.dll: Can't load IA 32-bit .dll on a AMD 64-bit 错误的原因是:jdk不是64位的,而是32 ...
- JSON数据格式介绍
JSON定义 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同一时候也易于机器解析和生成.它基于ECMA262语言规范(1999 ...
- SQL初级阶段笔记
DataBase Management Stystem(数据库管理系统)简称:DBSM:虽然DBSM并不等于数据库,但行业内通常将DBSM称为数据库,所以一般来说数据库就指的是DBSM. 简单来讲DB ...
- 关于ThreadAbortExcption异常处理
之前程序中,使用Thread.Abort()方法来终止线程的运行,但它是抛出ThreadAbortException异常来终止线程. 异常信息摘要: Unhandled Exception:Threa ...