SearchView无法将意图发送到结果活动

4
我有一个不起作用的SearchView。SearchView出现在菜单栏中,我可以输入文本。然而,当我点击手机屏幕键盘上的搜索图标时,什么都没有发生。理想情况下,这将启动一个新的活动,并发送一个查询字符串供使用。我尝试实现SearchView.setOnSearchClickListener方法来处理点击事件,但是这样做会导致结果活动在我点击搜索图标以输入文本时立即加载,且没有参数传递。非常感谢任何帮助指出我可能做错了什么。
我在我的Activity中像这样创建菜单:
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    final SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.convert:
            ...
            return true;
        default:
           return super.onOptionsItemSelected(item);
    }
}

搜索功能的XML代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item android:id="@+id/search"
            android:title="@string/search"
            android:icon="@android:drawable/ic_menu_search"
            app:showAsAction="always"
            android:actionViewClass="android.support.v7.widget.SearchView"
            app:actionViewClass="android.support.v7.widget.SearchView"/>

        <item android:id="@+id/convert"
            android:title="@string/dlconvert" />
    </menu>

我还将其添加到了搜索显示的活动清单中:
<meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable"/>

以下是搜索结果活动的定义:

<activity android:name=".ActivitySearchResults">
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable"/>

        <intent-filter>
            <action android:name="android.intent.action.SEARCH"/>
        </intent-filter>
    </activity>

可搜索的 searchable.xml 文件只包含以下内容:
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="Search..." />

编辑 - 问题与可能的重复不同。应该接收意图的活动根本没有启动。

你解决了吗..? - Goku
1
@Prem 我已经做了,谢谢。 - chaoskreator
6个回答

2

请尝试

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_menu, menu);

        MenuItem item = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);

        SearchView.SearchAutoComplete searchAutoComplete = searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
        searchAutoComplete.setHintTextColor(Color.GRAY);
        searchAutoComplete.setTextColor(Color.BLACK);


        return true;

    }

implements SearchView.OnQueryTextListener 添加到您的活动并覆盖方法。
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        Intent intent = new Intent(Activity.this, SearchActivity.class);
        intent.putExtra("query", query);
        startActivity(intent);
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        return false;
    }
}); 

这个答案是解决方案,当搜索结果活动是您的主要活动,并且您不希望另一个活动显示结果时。即使Android文档也没有涵盖这一点。谢谢@Goku - Reza

1
即使实现了onQueryTextSubmit,问题仍然存在。经过一天的搜索,我终于意识到在清单文件中的活动定义中,<action android:name="android.intent.action.SEARCH"/> 意图过滤器位置不正确。

0
在你的onCreateOptionsMenu()方法中:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        Intent intent = new Intent(MainActivity.this, SearchActivity.class);
        intent.putExtra("searchTerm", query);
        startActivity(intent);
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        return false;
    }
});

0
确保在您的搜索视图上实现setOnQueryTextListener
并在onQueryTextSubmit()方法中执行您所需的操作。
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    final SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextChange(String newText) {
            //Log.e("onQueryTextChange", "called");
            return false;
        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            // start acitivy here
            return false;
        }

    });
    return true;

}


0
在显示SearchView的活动中,您需要进行更改。
<meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable"/>

<meta-data
        android:name="android.app.default_searchable"
        android:value="ActivitySearchResults" />

-1
您需要使“searchResultActivity”可搜索。在具有searchview的活动中(在清单文件中),添加以下代码。
<meta-data
                android:name="android.app.default_searchable"
                android:value=".SearchResultActivity" /> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接