Android 开发之拦截EditText的输入内容,定制输入内容
1.EditText作为一个比较成熟的View,在Android的应用开发中得到极为广泛的使用。在某些特殊情况下,我们可能需要定制EditText的输入内容,
只允许指定功能的输入,例如输入一个”ddd:mm:ssssss“格式的度分秒角度。
一些错误的思路有:
(1)OnKeyListener,实现EditText的OnKeyListener并不能拦截EditText的输入,OnKeyListener只能够监听到一些按物理键事件,例如菜单键、返回键、音量键等,
而输入法作为一个单独的进程,EditText与输入法的通讯显然是OnKeyListener所无能为力的;
(2)TextWatcher,相信很多同志做这个功能的第一反应都是使用TextWatcher,因为TextWatcher可以监听到EditText输入前后内容的变化,但那也只是监听到而已
,它并没有办法真正拦截到输入,而只是在某一字符输入发生后,对EditText做一个事后的处理。典型的例子如下,假设我监听到了”s“的输入,但实际上我是不允许”s“输入的,那
么我在TextWatcher中监听到”s“输入了以后,重新设置EditText的内容。但这样做的恶果就是重设EditText的内容后,又会回调TextWatcher的那几个方法,造成死循环。当然您可以
设置一个标志位来停止这个循环,但麻烦不止于此。因为你是先让字符输入,然后再手动把它删除,那么这其中涉及到的光标位置调整,将无穷无尽……
2.讲述了上面两种典型的错误之后(事实上也是LZ曾经犯过的),介绍一下LZ对于真正EidtText输入拦截的实现。
既然系统给的接口都无法实现,那么势必要通过源码来解决问题了。EditText是继承与TextView的,TextView的源码量非常大,一个个函数看
肯定不现实,那么按关键字搜吧,搜索”input“可以查到”onCreateInputConnection“这个方法 ,字面意思创建与输入法的通信,返回的对象是InputConnection,
很有可能就是它了,InputConnectionWrapper 实现了InputConnection, 而这个类的实现方法中有两个极为可靠的方法,commitText, sendKeyEvent,字面意思提交文本
和按键事件。看到这里,想必思路也差不多了:
(1)重载onCreateInputConnection方法,它需要返回一个InputConnection对象;
(2)继承于InputConnectionWrapper, 实现自己的InputConnection 并且在onCreateInputConnection中返回。
(3)在自定义的InputConnectionWrapper类中,实现输入法输入和按键时间的拦截。
(4)拦截条件:在commitText方法中,如果执行父类的 commitText(即super.commitText(text, newCursorPosition))那么表示不拦截,如果返回false则表示拦截,
输入法的字符串则无法传送到EditText。在sendKeyEvent中,如果执行父类的sendKeyEvent(即super.sendKeyEvent(event))那么表示不拦截,如果返回false表示拦截。
3.至此,EditText的定制输入的最总要环节,拦截EditText与输入法的通讯已经成功实现,接下来的就是根据你的定制规则去重载你的commitText和sendKeyEvent方法吧。
几个重要的方法,
设置光标位置:setSelection(cursor - 1, cursor -1);
删除光标坐标0(m)个到光标右边1(n)个字符:deleteSurroundingText(0, 1);
此外,不同的输入法的KeyEvent方法可能有些不同,你需要查看SoftKeyboard示例源码来对你的应用进行调试,以使它能够兼容主流的输入法。
Android 开发之拦截EditText的输入内容,定制输入内容的更多相关文章
- Android开发UI之EditText+DatePicker带日期选择器的编辑框
1. 声明EditText变量,并关联到相应控件上 private EditText sellStartTime; private EditText sellEndTime; sellStartTim ...
- 【转载】Eclipse:Android开发中如何查看System.out.println的输出内容
Android开发中在代码中通过System.out.println的输出内容不知道去哪了,在console视图中看不到.而通过Log.i之类的要在Logcat视图中看到,夹杂了太多的其它App及底层 ...
- Android开发之输入框EditText介绍
这篇文章主要为大家详细介绍了Android布局之输入框EditText设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 现在先简单介绍一下技术点: 1.如何使用圆角输入框和按钮背景 2.如何实现 ...
- android 开发 使用自定义布局实现标题栏复用(标题栏内容自定义:使用代码实现和xml布局自定义属性2种办法实现)
在个人学习的情况下可能很少使用自定义布局去实现大量复用的情况下,但是在一个开发工作的环境下就会使用到大量复用的自定义控件. 实现思维: 1.写一个xml的布局,用于标题栏的样式,并且添加在标题栏中你想 ...
- android开发之 包含EditText组件 禁止自动获取焦点弹出输入法
在EditText标签的外层Layout中加入focusableInTouchMode属性 android:focusableInTouchMode="true" 即可.
- [转]【eoeAndroid索引】史上最牛最全android开发知识汇总
一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...
- 2017-2018-2 20165306 实验四《Android开发基础》实验报告
实验四<Android开发基础>实验报告 实验报告封面 实验内容 Android程序设计-1 实验要求: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView
1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...
- Android开发环境搭建(原创)
1,我的环境: win8 64位 2,软件安装: 1) jdk-7u40-windows-i586.exe 下载合适的版本,我下载的是 jdk7u40 32位 for windows 安装JDK,配置 ...
随机推荐
- 运用C#生成docx格式的报表
这几天在北京做一个大桥的监测系统的项目,涉及到一个功能,那就是采集数据,处理后,希望能自动生成一个报表,只需要在一个模板的基础上加几个数就可以了,但因为希望生成的是.docx格式的word2007/2 ...
- PLS-00221: 'function' 不是过程或尚未定义
直接调用addOrgunitInfoByBatch(r_user_batch.seq_id,'01'); 报错PLS-00221: 'function' 不是过程或尚未定义 原因是在调用函数时 ...
- 练习一:GitHub Desktop下载及使用
推荐使用Git for Windows,官方网站 https://git-for-windows.github.io/ 这里有我写的Git和Github教程:http://www.cnblogs.co ...
- Http-Only Cookie
设置Cookie的时候,如果服务器加上了HttpOnly属性,则这个Cookie无法被JavaScript读取(即document.cookie不会返回这个Cookie的值),只用于向服务器发送. S ...
- MySQL按照汉字的拼音排序,mysql汉字排序
按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...
- PostMan 发送list<Object>
- centos 安装php5.6
检查当前安装包 yum list installed | grep php 删除当前安装包 yum remove php.i686 php-bcmath.i686 php-cli.i686 php-c ...
- CodeForces #369 C. Coloring Trees DP
题目链接:C. Coloring Trees 题意:给出n棵树的颜色,有些树被染了,有些没有.现在让你把没被染色的树染色.使得beauty = k.问,最少使用的颜料是多少. K:连续的颜色为一组 ...
- Quartz Spring与Spring Task总结
Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下. 对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任 ...
- candence 知识积累3
1. PCB板型: 1.新建PCB:PCB design ,新建的类型为board ,输入名称和保存位置,设置图纸参数.网格参数. 2.建立PCB板外框:菜单Add下选择相应的工具.在Option选项 ...