SearchView在一个活动中产生另一个活动

我的用例如下:在活动A中,我有一个带有可折叠SearchView的操作栏。 当用户提出查询并按下“搜索”按钮时,我想显示活动B的结果。 我没有这样做,这是我的代码:

searchable.xml:

  

活动A:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); return true; } 

活动A和B的AndroidManifest:

              

Howerver,无论我尝试什么,A中的getSearchableInfo总是返回null。

我感觉我不理解某些东西。 我可以使getSearchableInfo()返回非null的唯一方法是将SEARCH意图filter和可搜索的元数据放入清单中的活动A. 但是,当我按下“搜索”按钮时,活动A的另一个实例再次在当前的实例之上启动,这绝对不是我想要的。 我想我可以将singleTop添加到A并在onNewIntent中处理SEARCH动作并启动B,但我通常不希望A成为singleTop,我想要默认值。 或者我呢?

我尝试将其添加到清单中的A(如其他一些线程中所建议的):

    

我究竟做错了什么?

编辑:我用A替换了A中的’getComponentName()’行:

 searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, ActivityB.class))); 

它似乎按我想要的方式工作! 我在这里做错了什么,或者这是正确的方法吗? 我有点不确定,因为它在任何地方都没有提到!

根据Android文档 , SearchManager.getSearchableInfo(componentName)接受一个参数,即:

componentName:获取可搜索信息的活动

在您的情况下,您需要ActivityB ,因此构造指向ActivityB的ComponentName是正确的方法

 new ComponentName(this, ActivityB.class) 
    

将此intentfilter添加到活动A.

2.SearchView菜单

 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); 

XML:

      

3.从oncreate调用此方法。

 private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); Debug.e("Suggestion handle click", "call " + query); startNextActivity(query); } } 

4.如果您使用Autosuggestion Listview实现searchView.setOnQueryTextListener,setOnSuggestionListener和setSuggestionsAdapter。