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,配置 ...
随机推荐
- cubic-bezier贝塞尔曲线css3动画工具
今天在一本叫<HTML5触摸界面设计与开发>上看到一个做弹跳球的复杂动画效果,首先加速下降,停止,然后弹起时逐渐减速.是用cubic-bezier贝塞尔曲线来完成的.所以特地去学习了一下关 ...
- LTE Module User Documentation(翻译7)——无线环境地图(REM)、AMC 模型 和 CQI 计算
LTE用户文档 (如有不当的地方,欢迎指正!) 12 Radio Environment Maps 通过使用类 RadioEnvironmentMapHelper 是可能输出文件 Radio E ...
- VM安装mac及dmg文件转换iso
今天心血来潮,突然看见一篇关于swift的入门教程,但是前提是有一台mac啊,于是对于屌丝,就只好装黑苹果或者是虚拟机上运行了,但是呢mac貌似听说(没用过)只能在inter上运行,屌丝的本子偏偏是A ...
- 19 Using Optimizer Hints
19.1 Overview of Optimizer Hints A hint is an instruction to the optimizer. In a test or development ...
- 如何设置WebViewer的参数栏显示状态
当为用户提供数据过滤功能时,需要为报表添加参数,而很多应用场景下,在初次展现报表时就为报表会展现全部的数据,然后再通过参数供用户选择,从而实现数据过滤,而一旦为参数设置默认值,参数面板就会自动隐藏.导 ...
- (转)【深入浅出jQuery】源码浅析2--奇技淫巧
[深入浅出jQuery]源码浅析2--奇技淫巧 http://www.cnblogs.com/coco1s/p/5303041.html
- POJ 1094 Sorting It All Out 拓扑排序 难度:0
http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...
- ionic 安装遇到的问题以及解决方案
公司里要用到 Ionic 做移动App 混合开发 一个环境搭建折腾了好几天.一是公司权限问题,二是网络问题,你懂得. Ionic 环境搭建官网有教程.本来几行命令就能搞定的事,一旦遇到网络问题,就蛋疼 ...
- TreeSet和Comparator 对TreeSet排序
使用TreeSet和Comparator,编写TreeSetTestInner类,要求对TreeSet中的元素"HashSet"."ArrayList".&qu ...
- MVC模型
MVC:model.view.controller. 浏览器browser发出一个请求,被servlet(控制器controller)接收,由servlet去实例化一个模型层(JavaBean)的对象 ...