最近遇到了一个问题如标题所述,其实有空格就无匹配结果其实是正常的,但是为啥拨号盘EditText会在号码中自动插入空格才是问题的关键。

其实无论是T9搜索还是空格的添加都和TextWatcher有关。

第一个TextWatcher

packages/apps/Dialer/src/com/android/dialer/DialtactsActivity.java

 protected void onCreate(Bundle savedInstanceState) {...mDigitsEditText.addTextChangedListener(mPhoneSearchQueryTextListener);...}

DialtactsActivity中添加了EditText的第一个TextWatcher,这个Watcher中负责T9搜索。

第二个TextWatcher

packages/apps/Dialer/src/com/android/dialer/dialpad/DialpadFragment.java

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {...mDigits.addTextChangedListener(this);...
}

fragment中的负责UI更新,例如拨号盘UI中的删除按键只有在EditText不为空的情况下才能点击。

第三个TextWatcher

第三个最为隐蔽,在Dialer中的代码中其实搜索不到的,但是它实际还是在DialpadFragment初始化的。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {...PhoneNumberFormatter.setPhoneNumberFormattingTextWatcher(getActivity(), mDigits);...
}

packages/apps/ContactsCommon/src/com/android/contacts/common/util/PhoneNumberFormatter.java

    public static final void setPhoneNumberFormattingTextWatcher(Context context,TextView textView) {new TextWatcherLoadAsyncTask(GeoUtil.getCurrentCountryIso(context), textView).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);}
    private static class TextWatcherLoadAsyncTask extendsAsyncTask<Void, Void, PhoneNumberFormattingTextWatcher> {private final String mCountryCode;private final TextView mTextView;public TextWatcherLoadAsyncTask(String countryCode, TextView textView) {mCountryCode = countryCode;mTextView = textView;}@Overrideprotected PhoneNumberFormattingTextWatcher doInBackground(Void... params) {return new PhoneNumberFormattingTextWatcherEx(mCountryCode); //后台生成TextWatcher对象}@Overrideprotected void onPostExecute(PhoneNumberFormattingTextWatcher watcher) {if (watcher == null || isCancelled()) {return; // May happen if we cancel the task.}mTextView.addTextChangedListener(watcher); //添加TextWatcher}}

packages/apps/ContactsCommon/src/com/mediatek/contacts/util/PhoneNumberFormattingTextWatcherEx.java

public class PhoneNumberFormattingTextWatcherEx extendsPhoneNumberFormattingTextWatcher {protected static boolean sSelfChanged = false; //这个类其实就是增加了一个成员,但是看不出这个成员有啥作用protected PhoneNumberFormattingTextWatcherEx() {}public PhoneNumberFormattingTextWatcherEx(String countryCode) {super(countryCode);}@Overridepublic void afterTextChanged(Editable s) {sSelfChanged = true;super.afterTextChanged(s); //调用基类方法sSelfChanged = false;}
}

frameworks/base/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java

不再贴代码,就是在afterTextChanged中格式化了号码,即添加了空格(中国区是添加空格,某些地区是添加“-”分隔符)。

根源

根本原因是对google原生代码的修改,原生中DialtactsActivity的TextWatcher其实是给另外一个EditText使用的,在修改代码中把EditText改为了同一个导致这个问题。而且这样的写法会导致TextWatcher的多次反复调用,所以修改原生代码要慎重啊。

Android拨号盘T9搜索号码中有空格就没有匹配结果的问题相关推荐

  1. Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人

    Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人 公司最近的项目中遇到一个需求需要读取通讯录联系人,并需要支持对联系人的模糊查询及批量选取,网上找了好几个例子,模糊查询 ...

  2. android 拼音搜索联系人分析与实现(支持多音字,支持T9搜索,支持Qwerty搜索)

    最近的项目开发过程中涉及到了联系人T9键盘搜索和Qwerty键盘搜索,也分别写了相关的博客: <android T9 搜索联系人分析与实现(支持多音字)> <android Qwer ...

  3. android T9 搜索联系人分析与实现(支持多音字)

    最近在android项目开发过程中需要实现类似电话拨号功能,这里涉及到T9键盘搜索联系人,于是研究了一番,将思路和心得记录于此,方便自己与他人. 相信大家对T9输入法并不陌生,这里并不涉及到T9输入法 ...

  4. android Qwerty 键盘搜索联系人分析与实现(支持多音字)

    最近在项目开发的过程中不仅仅涉及到T9搜索联系人,后来发现还需要支持Qwerty键盘搜索联系人.上次我已经写了一篇关于T9搜索的博客<android T9 搜索联系人分析与实现(支持多音字)&g ...

  5. 原生拨号盘 语音搜索按钮隐藏,点击搜索框退出后语音搜索按钮出现但点击无反应

    复现路径 1.点击进入拨号盘,搜索框没有语音搜索按钮 2.点击进入搜索框,然后点击搜索框左上角的返回按钮. 3. 返回后出现了红框中的语音搜索按钮 分析 抓取到控件名为voice_serach_but ...

  6. Android拨号盘特殊字符串处理

    Android拨号盘特殊字符串(例如*#06#显示IMEI或者MEID)处理的类是: packages/apps/Dialer/src/com/android/dialer/SpecialCharSe ...

  7. android 自定义搜索框edittext,Android编程自定义搜索框实现方法【附demo源码下载】...

    本文实例讲述了Android编程自定义搜索框实现方法.分享给大家供大家参考,具体如下: 先来看效果图吧~ 分析:这只是模拟了一个静态数据的删除与显示 用EditText+PopupWindow+lis ...

  8. oracle 的目录是空的,oracle sqlplus在@命令路径中有空格的问题

    我在 Linux上运行Oracle 11g,我正在尝试运行一个脚本来创建我的数据库.这个脚本在windows上运行正常,但是当我在Linux上测试它时,我收到以下错误: SP2-0556: Inval ...

  9. android studio设置Tab为四空格缩进

    今天,简单讲讲android studio 如何设置代码的缩进为4空格. 其实也很简单,有人认为android studio使用Tab缩进也没有问题,这个在android studio上确实是没有问题 ...

最新文章

  1. 杭电oj1003java实现
  2. 【Linux】一步一步学Linux——groupdel命令(88)
  3. 属性“dataProvider”有多个初始值设定项。(注意:“dataProvider”是“mx.charts.BarChart”的默认属性)。...
  4. 微信小程序 客服功能 客服消息
  5. 团队工作室展示官网源码带后台-源团V1.0版本
  6. Flink on Hive构建流批一体数仓
  7. 两个有序链表序列的交集_剑指offer第21天:合并两个有序链表
  8. Google 为什么以 Flutter 作为原生突破口?| 技术头条
  9. 数字的眼光看世界(常见常量、数值大下)
  10. 嵌入式ubuntu14.04开发环境搭建(详细图解)
  11. FFmpeg实现多段小视频合成
  12. Workbook.SaveAs方法
  13. 欧拉回路 - 铲雪车 - AcWing 1123
  14. java+图片高保真压缩_java对图片进行“高保真”压缩
  15. org.elasticsearch.common.util.concurrent.EsRejectedExecutionException 查询超时异常处理记录---一定要用单例模式
  16. 书论95 蒋骥《续书法论》
  17. 关于华为的工作情况的一些解答
  18. 学校教育网站建设方案
  19. ubuntu与win10共享LE蓝牙鼠标
  20. pink老师 js p85思考题

热门文章

  1. python3 excel数据处理_求推荐python3入门教程,适合新手的(python excel数据处理)
  2. 讯飞语音识别配置笔记
  3. Error:(9, 22) java: InetAddress()在java.net.InetAddress中不是公共的; 无法从外部程序包中对其进行访问
  4. 仿作苏宁易购主页(前端学习记录)
  5. 一个伪装QQ密码暴力查看器vbe脚本
  6. 苏宁iFunk品牌日来临,好货不断
  7. 计算机软件主要是由什么组成,计算机软件系统由什么组成
  8. 在线给图片添加水印,图片加水印方法教程!
  9. 【你足够努力了吗?】
  10. 写作之路,以梦为马,不负韶华