android 之EditText输入检測
近期开发一个功能的时候发生一个故事,其情节例如以下:
功能事实上不复杂,当中须要一个EditText来获取用户输入的信息.于是,我做了一个Dialog来显示我的输入界面(代码例如以下):
mAlertDialog = new AlertDialog.Builder(this)//, android.R.style.Theme_Holo_Light
.setIcon(R.drawable.ic_dialog_info_light)
.setTitle(R.string.model_rename_device)
.setView(createDialogView(deviceName))
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//String deviceName = mDeviceNameView.getText().toString();
reset_success=false;
reset_model_name(mDeviceNameView.getText().toString());
//finish();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//finish();
}
})
.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
if(reset_success){
start_confir_ResetPhone();
}else{
finish();
}
}
}) .create(); mAlertDialog.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
mAlertDialog.show();
private View createDialogView(String deviceName) {
final LayoutInflater layoutInflater = (LayoutInflater)this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.dialog_edittext, null);
mDeviceNameView = (EditText) view.findViewById(R.id.edittext);
mDeviceNameView.setFilters(new InputFilter[] {
new Utf8ByteLengthFilter(MODEL_NAME_MAX_LENGTH_BYTES)
});
mDeviceNameView.setText(deviceName); // set initial value before adding listener
mDeviceNameView.addTextChangedListener(this);
mDeviceNameView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
reset_model_name(v.getText().toString());
mAlertDialog.dismiss();
//finish();
return true; // action handled
} else {
//finish();
return false; // not handled
}
}
});
mDeviceNameView.setSelection(mDeviceNameView.length());
return view;
}
实现起来非常easy!只是当我把用户输入的字符串存储起来时候,问题就来了!
原来这个用户输入的字符串须要存储在一段我们自己配置的nv里面,重要的是,分给我存储的字符串的空间仅仅有20个byte,没有错就是byte. 所以非常easy,输入的字符最多不能超过20个字符,因为是byte类型,所以对于输入的字符必须做检測,其字符必须在一个byte取值空间(0-127)里面.实际上就是asic码.
所以须要对输入的字符检測.
为了可以实时检測EditText输入的字符你须要EditText.addTextChangedListener()来加入一个TextWatcher的检測器,而且实现当中的方法:
public void afterTextChanged(Editable s)
public void beforeTextChanged(CharSequence s, int start, int count, int after)
public void onTextChanged(CharSequence s, int start, int before, int count)
首当其冲想到的办法是在afterTextChanged方法里面推断当前输入的字符是否时正确的字符,假设不是就通过Editable s来更改:s.delete()来删除.或者直接使用这个EditText的去从新设置输入的字符:setText();
事实上,这两个办法都不行,当高速输入不正确的字符时候就会出现异常,非常显然时同步的问题.
非常快我给出来另个解决方法:在onTextChanged()里面检測是否有异常的字符,假设有则通过Handler发送消息的形式来处理.
public void onTextChanged(CharSequence s, int start, int before, int count) {
for(int i=0; i < count; i++){
if(s.charAt(i+start) > 127 || s.charAt(i+start) < 0){
Message msg = mHandler.obtainMessage(handleMessage_detection_MG);
msg.obj = s;
mHandler.sendMessage(msg);
break;
}
}
//Log.d(DEBUG_STR,"onTextChanged str="+s.toString()+"start="+start+"; before="+before+"; count="+count);
}
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case handleMessage_detection_MG:
InptText_Error_correction((CharSequence) msg.obj);
break;
case handleMessage_blue_name_MG:
InptText_rename_blue((String) msg.obj);
break;
default:
break;
}
}
};
private void InptText_Error_correction(CharSequence chars){
if(chars != null){
StringBuilder str_b = new StringBuilder(chars);
char temp;
int start_indx = -1;
for(int i = 0; i < str_b.length(); i++){
temp = str_b.charAt(i);
if(temp > 127 || temp < 0){
if(start_indx < 0){
start_indx = i;
}
str_b.deleteCharAt(i);
}
}
mDeviceNameView.setText(str_b.toString());
if(start_indx < 0){
start_indx = mDeviceNameView.length();
}
mDeviceNameView.setSelection(start_indx);
Toast.makeText(Rename_model_activity.this, getString(R.string.set_name_Error_Character_notice),
Toast.LENGTH_SHORT).show();
}
}
最后要说的是:对于输入字符的限制能够通过EditText.setFilters()来配置:
mDeviceNameView.setFilters(new InputFilter[] {
new Utf8ByteLengthFilter(MODEL_NAME_MAX_LENGTH_BYTES)
});
MODEL_NAME_MAX_LENGTH_BYTES时输入字符的最大长度,Utf8ByteLengthFilter是InputFilter的子类.这里就是对输入长度的适配.
事实上你会非常快发现!InputFilter就是一个对输入字符的检測器.所以对于输入字符错误检測事实上不用那么麻烦,事实上InputFilter全然能够解决.实现他的方法:
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend)
对于输入的错误字符,字节返回""就能够:
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if(c > 127 || c < 0){
return "";
}
}
android 之EditText输入检測的更多相关文章
- android判断EditText输入的数字、中文还是字母方法
String txt = edInput.getText().toString(); Pattern p = Pattern.compile("[0-9]*"); Mat ...
- android的edittext输入长度
http://blog.csdn.net/uyu2yiyi/article/details/6329738 http://flysnow.iteye.com/blog/828415/ http://s ...
- Android 实现限制EditText输入文字的数量
前段时间比较忙 没来的及时分享出来.需求是这样的要求用户只能输入12个字符或者6位中文的数据:作为一个菜鸟遇到这样的问题第一反应就是 Android:maxLength="12"这 ...
- Android内存泄漏检測与MAT使用
公司相关项目须要进行内存优化.所以整理了一些分析内存泄漏的知识以及工作分析过程. 本文中不会刻意的编写一个内存泄漏的程序,然后利用工具去分析它.而是通过介绍相关概念,来分析怎样寻找内存泄漏.并附上自己 ...
- Chromium网页输入事件捕捉和手势检測过程分析
连续的输入事件可能会产生一定的手势操作.比如滑动手势和捏合手势. 在Chromium中,网页的输入事件是在Browser进程中捕捉的.Browser进程捕获输入事件之后,会进行手势操作检測.检測出来的 ...
- Android限定EditText的输入类型为数字或者英文(包括大小写),EditText,TextView只能输入两位小数
Android限定EditText的输入类型为数字或者英文(包括大小写) // 监听密码输入框的输入内容类型,不可以输入中文 TextWatcher mTextWatcher = new Tex ...
- Android 检測网络是否连接
权限: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <u ...
- Android中EditText设置输入条件
一.应用场景 之前做商城应用时,会有对用户资料的设置情况进行限制,如下: (1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号, (2)用户手机,应当只能输入数字,禁止输入其他字符. (3)用户 ...
- Android开发中,使用 EditText 输入内容,如何进行一键清空内容处理
本文仅为个人的处理方式,希望能对您有所帮助,欢迎各位留言指正,抱拳了 1.text.xml示例: <?xml version="1.0" encoding="utf ...
随机推荐
- Linux I2C驱动
Linux I2C 驱动结构 i2c体系结构由三部分组成 i2C core i2c core提供了i2c 总线驱动 和 设备驱动的注册,注销方法 i2C and SMBus protocol 实现 i ...
- Django:调用css、image、js
1.在项目的manage.py同级目录创建static.templates 2.编辑settings.py,在最后加入 STATIC_URL = '/static/' HERE = os.path.d ...
- SolrCloud架构
原文链接 https://blog.csdn.net/dingzfang/article/details/42804489 1 核心概念 Collection Shard 均为逻辑上的概念 Core为 ...
- 71.mybatis 如何获取插入的id【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 在之前的文章已经讲过spring boot集成mybatis了,但是忘记说一个很重要的知识点了,那就是获取获取主键id,这篇文章补充下,sprin ...
- hexo干货系列:(四)将hexo博客同时托管到github和coding
前言 之前我们把hexo托管在github,但是毕竟github是国外的,访问速度上还是有点慢,所以想也部署一套在国内的托管平台,之前查资料听说gitcafe,但是听说gitcafe已经被coding ...
- F5 TCP Traffic Flow v0.5
300dpi高清版下载地址 http://down.51cto.com/data/2332253
- 七牛云 GO 语言周报【七月第 2 期】
全世界有多少 Gopher? 上周的周报中,我们介绍了 Go 语言的排名已经进入到前十.那么世界上到底有多少 Gopher 呢? 作者列出了以下计算公式: Gopher 数量 = 全世界的开发者数量 ...
- [codevs1050]棋盘染色 2
[codevs1050]棋盘染色 2 试题描述 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. 输入 第一行一个整数N(<=100) ...
- Gym - 100548C The Problem Needs 3D Arrays (最大密度子图)
TK在大多数 Unix平台.Windows平台和Macintosh系统都是预装好的,TKinter 模块是 Tk GUI 套件的标准Python接口.可实现Python的GUI编程. Tkinter模 ...
- POJ3041:Asteroids【二分图匹配】
二分图的最大匹配=最小顶点覆盖(Konig定理)=最大独立集的补集最大匹配经典的三种模型 这题就是最小顶点覆盖,顺便这题留给我的经验就是调试的时候一定要细心细心再细心对模板的各个细节都要熟!! #i ...