java - 无法让 android.support.v7.widget.SearchView 接受文本

标签 java android searchview android-toolbar

在我的支持工具栏中尝试让 SearchView 正常工作数小时后(它出现,显示提示文本但拒绝接受文本),我不得不求助于您。

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

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

我已经正确设置了 AndroidManifest.xml 文件,我有一个 searchable.xml,据我所知,它被正确引用(我的意思是,提示文本通常显示在 SearchView 字段中),我有一个搜索在 list 中设置了 android.intent.action.SEARCH Intent 过滤器的结果 Activity 。

仍然没有。老实说,我被难住了。

这是 SearchView 托管 Activity 的 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 中。它甚至将 Intent 中识别的短语发送到搜索结果 Activity 。唯一的问题是我根本无法在文本字段中输入文本——那里甚至没有光标闪烁。尝试执行类似 searchView.requestFocus() 的操作没有结果。

最佳答案

在为此浪费了 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 获得焦点。我怀疑抽屉导航专注于 Activity 创建,也许这就是问题的根源,但我还不确定。

关于java - 无法让 android.support.v7.widget.SearchView 接受文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29223299/

相关文章:

java - 将另一个api的返回数据集成到服务方法中

java - 使用单个 ExceptionMapper 捕获 Jackson 抛出的任何异常

java - Abstract int() 导致我的应用程序出现隐形停止

java - Azure 存储 Java API : Account does not support HTTP

android - 如何让水平进度条停留在工具栏顶部

java - 没有操作栏的搜索 View

android - SearchView 为 null android

android - Retrofit Request Interceptor 阻塞主线程

android - PlaceLikelihoodBuffer 为空

android - android中的SearchView自定义字体