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

复现路径

1.点击进入拨号盘,搜索框没有语音搜索按钮

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

2.点击进入搜索框,然后点击搜索框左上角的返回按钮。

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

3. 返回后出现了红框中的语音搜索按钮

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

分析

抓取到控件名为voice_serach_button。

对此控件操作的有两个文件DialetactsActivity.java和SearchEditTextLayout.java.

为什么一开始打开拨号盘,语音搜索按钮隐藏?

DialetactsActivity.java的onResume函数调用prepareVoiceSearchButton:

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

通过pacakageManager查询,如果有处理android.speech.action.RECONGNIZE_SPEECH的Activity则将语音搜索按钮设置为可见,否则隐藏。

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

为什么后面语音搜索按钮又出现了?

问题出现在另一个文件SearchEditTextLayout.java里。

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

当搜索框折叠,展开等操作时,dialactsAcitivity通过ActioinBarContoller控制SearchEditTextLayout中元素的可见性。

核心函数是updateVisisbility。注意,此函数只是判断如果搜索框收起,则显示语音搜索按钮。没有进行是否有Activity可以处理语音识别。所以一点收起刷新搜索框,则会显示隐藏的语音搜索按钮:

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

修改方法:

参考DialetactsActivity.java,刷新搜索框时判断是否有Activity处理语音识别。

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