【问题标题】:Cannot get android.support.v7.widget.SearchView to accept text无法让 android.support.v7.widget.SearchView 接受文本
【发布时间】:2015-03-24 01:10:46
【问题描述】:

经过数小时尝试在我的支持工具栏中获得支持 SearchView 以正常工作(它显示,显示提示文本但拒绝接受文本),我不得不求助于你。

我已经在 Google 上搜索了几个小时,在这里和其他网站上阅读了很多答案,查看了很多文档和一篇关于该主题的特定博客文章,但我就是无法找出问题所在。

正如我所说,我正在使用 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"

在可搜索的.xml 中。它甚至将意图中识别的短语发送到搜索结果活动。唯一的问题是我根本无法在文本字段中输入文本——那里甚至没有光标闪烁。尝试执行类似 searchView.requestFocus() 的操作没有结果。

【问题讨论】:

    标签: java android searchview android-toolbar


    【解决方案1】:

    在为此浪费了 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 成为焦点。我怀疑导航抽屉的重点是创建活动,这可能是问题的根源,但我还不确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      相关资源
      最近更新 更多