原生拨号盘 语音搜索按钮隐藏,点击搜索框退出后语音搜索按钮出现但点击无反应
复现路径
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处理语音识别。