我的使用案例如下:在活动A中,我有一个带有可折叠搜索视图的操作栏。当用户输入查询并按下“搜索”按钮时,我想展示结果的B活动。但我无法做到这一点,以下是我的代码:
searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/action_search_hint"
android:label="@string/app_name"/>
活动 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;
}
Activity A 和 B 的 AndroidManifest:
<activity
android:name=".ActivityA">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".ActivityB">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
无论我尝试什么,A中的getSearchableInfo始终返回null。我感觉我没有理解某些东西。唯一能使getSearchableInfo()不返回null的方法是将SEARCH意图过滤器和可搜索元数据放入清单文件中的A活动中。但是,当我按下“搜索”按钮时,另一个A活动实例会再次在当前活动之上启动,这绝对不是我想要的。我猜我可以将singleTop添加到A,并在onNewIntent中处理SEARCH操作并启动B,但通常我不希望A成为singleTop,我想要默认的。还是我需要singleTop呢?我尝试将以下内容添加到清单文件A中(如一些其他线程中建议的): <meta-data
android:name="android.app.default_searchable"
android:value=".ActivityB" >
</meta-data>
我做错了什么?
编辑:我在A中用以下代码替换了'getComponentName()'行:
searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, ActivityB.class)));
看起来这个方法能够按照我的期望工作!我是不是做错了什么,或者这就是正确的方式?我有点不确定,因为没有任何地方提到过它!
getSearchableInfo(componentName)
需要一个参数,即“要获取可搜索信息的活动”。在您的情况下,您需要ActivityB,因此构造指向ActivityB的ComponentName
是正确的方法。 - hidro