拨号界面号码自动输入法空格怎么打的空格删除时怎么取消

[原创]Android实现输入手机号时自动添加空格 - 简书
[原创]Android实现输入手机号时自动添加空格
为了优化用户体验,我们往往会在让用户输入手机号码时添加空格,比如:133 .那么在Android中如何实现呢?
Android中的输入框EditText有个方法addTextChangedListener(),该方法实现输入框文字变动时的监听.该方法需要传入一个TextWatcher接口的实现.
TextWatcher接口如下:
public interface TextWatcher extends NoCopySpan {
public void beforeTextChanged(CharSequence s, int start, int count, int after);
public void onTextChanged(CharSequence s, int start, int before, int count);
public void afterTextChanged(Editable s);
该接口有三个回调函数,其含义如下:
public abstract void beforeTextChanged (CharSequence s, int start, int count, int after):
This method is called to notify you that, within s, the count characters beginning at start are about to be replaced by new text with length after. It is an error to attempt to make changes to s from this callback.在字符串s内,从索引为start(包含)的字符开始的count个字符将被长度为after的新文本代替
public abstract void onTextChanged (CharSequence s, int start, int before, int count)
This method is called to notify you that, within s, the count characters beginning at start have just replaced old text that had length before. It is an error to attempt to make changes to s from this callback.在字符串s内,从索引为start(包含)的字符开始count个字符刚刚替换了长度为before的旧字符.;
public abstract void afterTextChanged (Editable s)
This method is called to notify you that, somewhere within s, the text has been changed. It is legitimate to make further changes to s from this callback, but be careful not to get yourself into an infinite loop, because any changes you make will cause this method to be called again recursively. (You are not told where the change took place because other afterTextChanged() methods may already have made other changes and invalidated the offsets. But if you need to know here, you can use setSpan(Object, int, int, int) in onTextChanged(CharSequence, int, int, int) to mark your place and then look up from here where the span ended up.字符串s内容已经发生了变化.可以在这一步对s进行合理的变更,但是要注意不要进入无限循环,因为字符串的任何变化都会再次递归调用此回调方法.在这个方法中不会告诉你字符串哪些内容发生了变化,因为其他针对字符串的改变已经调用了afterTextChanged().如果你想知道哪些发生了变化,可以在onTextChanged(CharSequence, int, int, int)使用setSpan(Object, int, int, int)做标记.
看上面的解释,是不是还是有点糊涂呢?下面就用实例来解释一下吧.
代码很简单,只有一个输入框EditText,然后添加一个TextWatcher实现,将回调中的结果输出.
public class MainActivity extends AppCompatActivity {
private EditText editT
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.edit_text);
editText.addTextChangedListener(textWatcher);
private final TextWatcher textWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
DLog.d("----------beforeTextChanged----------\n");
DLog.d("s:" + s + "\n");
DLog.d("start:" + start + "\n");
DLog.d("count:" + count + "\n");
DLog.d("after:" + after + "\n");
public void onTextChanged(CharSequence s, int start, int before, int count) {
DLog.d("----------onTextChanged----------\n");
DLog.d("s:" + s + "\n");
DLog.d("start:" + start + "\n");
DLog.d("before:" + before + "\n");
DLog.d("count:" + count + "\n");
public void afterTextChanged(Editable s) {
DLog.d("----------afterTextChanged----------\n");
DLog.d("s:" + s + "\n");
其中Dlog类参见此处:
默认输入框没有任何内容,以下操作在上一步之后进行.
输入一个字符
在输入框输入字符:1,各回调方法输出的信息如下(注释为作者后来添加):
----------beforeTextChanged----------
//注释:在字符串""从索引0处开始的0个字符将被长度为1的新字符串代替
//即""将被1代替
----------onTextChanged----------
//注释:字符串"1"从索引0处开始的1个字符刚刚替换了长度为0的旧字符串
//即1刚刚代替了""
----------afterTextChanged----------
//注释:发生变化后的字符串为:"1"
输入两个字符
在输入框一次性输入字符(即粘贴):23,各回调方法输出的信息如下(注释为作者后来添加):
----------beforeTextChanged----------
//注释:在字符串"1"从索引1开始的0个字符将被长度为2的新字符串代替
//即""将被23代替
----------onTextChanged----------
//注释:字符串"123"从索引1开始的2个字符刚刚替换了长度为0的旧字符串
//即23刚刚代替了""
----------afterTextChanged----------
//注释:发生变化后的字符串为:"123"
输入三个字符
在输入框一次性输入字符(即粘贴):456,各回调方法输出的信息如下(注释为作者后来添加):
----------beforeTextChanged----------
//注释:在字符串"123"从索引3开始的0个字符将被长度为3的新字符串代替
//即""将被456代替
----------onTextChanged----------
//注释:字符串"123456"从索引3开始的3个字符刚刚替换了长度为0的旧字符串
//即456刚刚代替了""
----------afterTextChanged----------
//注释:发生变化后的字符串为:"123456"
删除一个字符
在输入框删除字符:6,各回调方法输出的信息如下(注释为作者后来添加):
----------beforeTextChanged----------
//注释:在字符串"123456"从索引5开始的1个字符将被长度为0的新字符串代替
//即6将被""代替
----------onTextChanged----------
//注释:字符串"12345"从索引5开始的0个字符刚刚替换了长度为1的旧字符串
//即""刚刚代替了6
----------afterTextChanged----------
//注释:发生变化后的字符串为:"12345"
删除两个字符
在输入框一次性删除字符:45,各回调方法输出的信息如下(注释为作者后来添加):
----------beforeTextChanged----------
//注释:在字符串"12345"从索引3开始的2个字符将被长度为0的新字符串代替
//即45将被""代替
----------onTextChanged----------
//注释:字符串"123"从索引3开始的0个字符刚刚替换了长度为2的旧字符串
//即""刚刚代替了45
----------afterTextChanged----------
//注释:发生变化后的字符串为:"123"
将一个字符替换为两个字符
在输入框选中3粘贴为ab,各回调方法输出的信息如下(注释为作者后来添加):
----------beforeTextChanged----------
//注释:在字符串"123"从索引2开始的1个字符将被长度为2的新字符串代替
//即3将被ab代替
----------onTextChanged----------
//注释:字符串"12ab"从索引2开始的2个字符刚刚替换了长度为1的旧字符串
//即ab刚刚代替了3
----------afterTextChanged----------
//注释:发生变化后的字符串为:"12ab"
将两个字符替换为一个字符
在输入框选中ab粘贴为3,各回调方法输出的信息如下(注释为作者后来添加):
----------beforeTextChanged----------
//注释:在字符串"12ab"从索引2开始的2个字符将被长度为1的新字符串代替
//即ab将被3代替
----------onTextChanged----------
//注释:字符串"123"从索引2开始的1个字符刚刚替换了长度为2的旧字符串
//即3刚刚代替了ab
----------afterTextChanged----------
//注释:发生变化后的字符串为:"123"
任意位置插入一个字符串
在输入框中2的后面输入5,各回调方法输出的信息如下(注释为作者后来添加):
----------beforeTextChanged----------
//注释:在字符串"123"从索引2开始的0个字符将被长度为1的新字符串代替
//即""将被5代替
----------onTextChanged----------
//注释:字符串"1253"从索引2开始的1个字符刚刚替换了长度为0的旧字符串
//5刚刚代替了""
----------afterTextChanged----------
//注释:发生变化后的字符串为:"1253"
从上面我们可以看出,在onTextChanged方法中字符串已经发生变化,我们可以在此对用户输入的字符串追加空格.用户是一个数字一个数字的输入到输入框中,那么条件为:
字符串s从索引start开始的1个字符刚刚替换了""
public void onTextChanged(CharSequence s, int start, int before, int count) {
DLog.d("----------onTextChanged----------\n");
DLog.d("s:" + s + "\n");
DLog.d("start:" + start + "\n");
DLog.d("before:" + before + "\n");
DLog.d("count:" + count + "\n");
if (count == 1){
int length = s.toString().length();
if (length == 3 || length == 8){
editText.setText(s + " ");
editText.setSelection(editText.getText().toString().length());
当长度为3和8时分别加上空格.
运行程序得到结果如下:
更多文章请移步我的博客:如题:为了在权限中省去一项容易让人误解的拔打电话权限,看到有的程序会直接打开拨号界面,但不是直接打电话。这样的话就不需要android.permission.CALL_PHONE的权限
其实还是挺简单的
Uri uri = Uri.parse(&tel:&); &
//直接拔打电话 需要权限
&Intent intent = new Intent(Intent.ACTION_CALL, uri); &&
//跳至拨号界面,并填写上号码不需要权限
&Intent intent = new Intent(Intent.ACTION_DIAL, uri); &
关于更多的跳至系统的拨号界面、短信界面、联系人界面、浏览网页、显示地图、发短信、发彩信、发送Email、播放多媒体、安装apk、卸载apk、打开相机、打开录音机、显示应用列表、寻找应用、打开另一个应用程序、添加到短信收件箱、从SIM卡或联系人中查询、删除联系人、添加到联系人、从market上搜索指定的package name、等可以参考
本文已收录于以下专栏:
相关文章推荐
android实现拨打电话但不弹出拨号界面
1、只调用拨号界面,不拨出电话
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(...
如何通过拨号界面打开隐藏界面,从而打印一些调试信息
需要使用反射机制将ITelephony反射出来进行操作。
private void dial(String number) {
ClassTelephonyManager> c...
1---------------------------------------------------------------
----------------------------------...
有些时候拨打电话的时候,需要让用户自己选择 拨号器应用,实现方法如下:
Intent call = new Intent();
call.setAction(Intent.ACTION_D...
1. 注解掉格式化处理
FILE: PhoneNumberFormatter.java
Before KK1
PATH: alps/packages/apps/contacts/src...
欢迎大家我分享和推荐好用的代码段~~
欢迎转载,但请保留文章原始出处:
CSDN:http://www.csdn.net
cordova插件实现拨打电话,支持两种形式:
1,直接拨号;
2,跳转到拨号界面,但不拨号,自动填充号码;...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在输入电话号码的时候,我们看到很多app可以输入130 xxxx xxxx的格式,即中间空一格。如下图
其实做起来也比较简单,只要在输入的时候实现TextWatcher监听就好,具体的监听代码如下:
phone.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s == null || s.length() == 0) return;
StringBuilder sb = new StringBuilder();
for (int i = 0; i & s.length(); i++) {
if (i != 3 && i != 8 && s.charAt(i) == ' ') {
sb.append(s.charAt(i));
if ((sb.length() == 4 || sb.length() == 9) && sb.charAt(sb.length() - 1) != ' ') {
sb.insert(sb.length() - 1, ' ');
if (!sb.toString().equals(s.toString())) {
int index = start + 1;
if (sb.charAt(start) == ' ') {
if (before == 0) {
if (before == 1) {
phone.setText(sb.toString());
phone.setSelection(index);
public void afterTextChanged(Editable editable) {
其中phone即为输入电话号码的编辑框。仅这一处改变,其他按照正常操作就好。
本文已收录于以下专栏:
相关文章推荐
在Android开发过程中,有些应用会要求用户输入手机号,比如手机号码验证,为了便于观看,我们都会以188 xxxx xxxx这种格式进行展示。...
欢迎大家我分享和推荐好用的代码段~~
欢迎转载,但请保留文章原始出处:
CSDN:http://www.csdn.net
----------------------------------------------------------------------------------------------
原文地址...
EditTextView 带空格分隔的输入(电话号码,银行卡)标签(空格分隔): Android电话号码输入框需求:
三位,七位后有空格
删除倒数第四,第八位会将空格也删除
使用TextWatcher...
出自:/jico/archive//1867437.html
假若TextView文本中有电话号码或者网址,我想通过点击电话号...
继承EditText封装了一个多项功能的XEditText,具体非常实用的功能。具有如下特点:
自带清除功能图标,点击清除输入内容
输入时手机号时自动分割:138 ,提高用户体验,轻...
1. 注解掉格式化处理
FILE: PhoneNumberFormatter.java
Before KK1
PATH: alps/packages/apps/contacts/src...
一次愉悦的问题解决过程
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)|||||CeleDial智能拨号 for iPhone v2.4.18 官方版
您的位置:& > &CeleDial智能拨号 for iPhone v2.4.18 官方版
CeleDial智能拨号 for iPhone v2.4.18 官方版
网友评分:
软件大小:1.54MB
软件语言:简体中文
软件类型:国产软件
软件类别:iphone
更新时间:
软件授权:免费版
官方网站:
运行环境:iPhone
6.43MB/简体中文/6
12.39MB/简体中文/3.8
19.66MB/简体中文/6.7
2.94MB/简体中文/6.1
4.27MB/简体中文/5.7
智能手机拨号软件 CeleDial 是最方便快捷的的智能拨号助手,可以帮助您快速地找到需要的联系人,真正做到“想到即找到,随手可呼叫”。? 提供精美设计的拨号程序,支持换肤。使用类似 iPhone 拨号程序的数字/字母拨号界面,不改变既有习惯,简单易用。? 支持各种自然思维的方式查找联系人,在数字/字母拨号界面上输入姓名拼音、简拼、混拼或电话号码的部分或全部,想到就能立即找到。以“诸葛亮(电话:1860588xxxx)"为例,您可以通过拼音(ZhuGeLiang)、简拼(ZGL)、混拼(ZGLiang )或电话号码(18605...)找到该联系人。如果是英文的姓名,也可以直接在拨号盘上输入(注意是字母和数字组合的按钮)。? 支持号码归属地查询功能。默认仅为长按菜单、陌生号码或者当输入号码不在联系人列表时,才显示归属地信息。如果要强制开启查询归属地功能,可以在设置中『显示“添加”按钮”当输入达到』中,输入一个数字,如『3』。? 内置支持简体拼音、通用拼音、注音符号方式搜索联系人。如果选择注音符号搜索方式,会自动显示注音符号拨号界面。? 支持简体中文、繁体中文和英文界面。
CeleDial 曾经是 Windows Mobile Pocket PC 上必备的智能拨号实用工具,自 2005 年开始一直只专注于联系人号码查找体验,未加入任何网络功能。iPhone 版本除了关于界面上的几个在线信息网页外,本程序不会进行任何网络连接,更不会上传联系人或泄露个人隐私,请放心使用:)
由于 iPhone 系统设计的限制,本程序和其它所有 AppStore 中提供的程序一样,有以下局限性:? 无法获取系统的通话记录;? 呼叫前需要确认,或者通话结束后无法自动返回本程序(可在设置中选择何种方式);? 无法截获或者修改通话过程,因此来电号码归属地自动查询、接通提醒、电话防火墙等功能无法实现。
如果由此造成任何不便,请谅解。欢迎给我们评分,或反馈意见和建议。
版本 2.4.18 中的新功能 1. 支持选定特定联系人分组;2. 新增联系人助手功能(注意:风险自负,仅供完美主义者或强迫症专用!!!:)。
1). 在多个Google、iCloud、Hotmail账户之间同步联系人:使用之前在系统设置中添加多个联系人账户即可,然后在CeleDial设置中,点击所有联系人群组,在下面展开的单个联系人账号的右侧点击有命令可以操作。目前仅支持单向同步。2). 电话号码批量添加国家区号(如+86):8个数字以上的才会添加,区号是根据区域设置来的,中国+86,已经有+或00开头的,不会添加。会自动删除“-”和“ ”(空格)。3). 批量删除国家区号(如+86)。4). 批量合并姓氏和名字。5). 批量拆分姓氏和名字:仅拆分2、3、4个非英文字母的姓名,或者带空格的英文姓名,拆分和合并可以轮着用,整理得更透彻。6). 把未分组的联系人添加到“未分组”中(以便整理):仅支持 CardDAV/Local/iCloud 账户,推荐iCloud分组,可以同步到 iCloud上来管理分组。Exchange不支持分组,iOS的设计如此。Google 已经支持 CardDAV,但Google 竟然不支持同步分组(不过跟CeleDial没关系)。
iOS SDK 不支持读取联系人账户的名称,只能读取类型,更悲催的是iCloud类型的联系人,实际上也是CardDAV,所以没法很好地来标识联系人来源,再次提请注意:请确认操作不会造成联系人数据丢失!!
最好是在iPhone中,关闭掉网络,然后使用后,检查一下联系人没问题,再打开网络同步到网上。
软件无法下载或下载后无法使用,请点击报错,谢谢!
请描述您所遇到的错误,我们将尽快予以修正,谢谢!
*必填项,请输入内容
本类下载排行

我要回帖

更多关于 输入法空格成了删除 的文章

 

随机推荐