无法获取android.support.v7.widget.SearchView接受文本

时间:2015-03-24 01:10:47

标签: java android searchview android-toolbar

在我的支持工具栏中尝试获得支持SearchView以便正常工作(显示,显示提示文本但拒绝接受文本)数小时后,我必须转向您。

我已经谷歌搜索了几个小时,在这里和其他网站上阅读了很多答案,检查了很多文档和一个处理该主题的特定博客文章,但我无法隔离这个问题。

正如我所说,我使用的是SearchView和Toolbar以及MenuItemCompat的支持版本。另外,ActionBarActivity。我确保我虔诚地遵循了所有步骤(this blog post在这个问题上有很多话要说,甚至在官方文件中都有错误)。

我已经正确设置了AndroidManifest.xml文件,我有一个searchable.xml,据我所知,正确引用(我的意思是,提示文本通常出现在SearchView字段中),我有一个搜索在清单中设置android.intent.action.SEARCH意图过滤器的结果活动。

仍然没有。老实说我真的很难过。

这是SearchView托管活动的onCreateOptionsMenu():

@Override
public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        MenuItem search = menu.findItem(R.id.search);

        searchView = (SearchView) MenuItemCompat.getActionView(search);

        SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);

        searchView.setSearchableInfo(searchManager
                .getSearchableInfo(getComponentName()));
        return true;
    }

这是res / xml中的searchable.xml:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/search_hint"
    android:label="@string/search_title" >

</searchable>

最后,这是res / menu中的menu.xml文件:

<item
        android:id="@+id/search"
        android:icon="@drawable/ic_search_white_18dp"
        android:title="@string/search_title"
        myappname:actionViewClass="android.support.v7.widget.SearchView"
        myappname:showAsAction="ifRoom|collapseActionView"/>

(显然myappname在这里替换了我的真实应用名称。)

奇怪的是,添加

后,语音搜索工作正常
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
在searchable.xml中。它甚至将意图中的已识别短语发送到搜索结果活动。唯一的问题是我根本无法在文本字段中输入文本 - 甚至没有光标在那里闪烁。尝试执行类似searchView.requestFocus()的操作没有结果。

1 个答案:

答案 0 :(得分:2)

在浪费了8个小时之后,我想出了一个解决方案。我不确定它有多少黑客但它有效。

我注意到,就聚焦而言,SearchView中的EditText行为不规律:它没有光标,奇怪的是,当我拉下通知抽屉时,它似乎改变了焦点。我决定采用的理论是问题是SearchView内部EditText的重点,所以我去寻找EditText的android.R.id。

搜索之后,我遇到了this answer。所以我在SearchView中引用了EditText:

EditText searchField = (EditText) 
searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);

然后我请求焦点为EditText:

searchField.requestFocus();

...突然,SearchView可以接受文本,所有相关的回调都在工作!

我只剩下一个问题:当调用onPause()时,我的解决方案因EditText失去焦点而停止工作。所以我刚补充说:

invalidateOptionsMenu();

...在onResume()中,现在它完美无缺。

我必须说,但是,这是一个非常奇怪的经历,因为我虔诚地遵循了这些步骤(不是在官方的Android开发者指南中,它有很多错误)并且仍然无法使SearchView EditText成为焦点。我怀疑导航抽屉是否关注活动的创建,也许这就是问题的根源,但我还不确定。