我整天都在讨论这个问题:
我有两个活动MainActivity
和SearchDaemon
,我想将搜索界面设为MainActivity
,并将查询请求委托给SearchDaemon
,这将保留所有搜索请求在我的应用程序(没有UI)中,这是我的manifeset.xml:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value=".SearchableActivity"/>
</activity>
<activity
android:name=".search.SearchDaemon"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
MainActivity
:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_normal, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.map_menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}
但是当我在searchview中输入内容并提交时,我无法进入SearchDaemon
。
有什么问题?
答案 0 :(得分:1)
您需要更改清单中的声明。从.MainActivity
删除与搜索相关的信息,并将android:value
添加到.search.SearchDaemon
。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".search.SearchDaemon"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"
android:value=".search.SearchDaemon" />
</activity>
更改使用setSearchableInfo
的方式:
searchView.setSearchableInfo(searchManager.getSearchableInfo(
new ComponentName(getApplicationContext(), SearchDaemon.class)));
答案 1 :(得分:0)
看起来MainActivity块中的元数据不正确 - 您是否有一个名为SearchableActivity
的类?:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value=".SearchableActivity"/>
</activity>
<activity
android:name=".search.SearchDaemon"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
如果您将其更改为SearchDaemon,它应该有效:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value=".search.SearchDaemon"/>
</activity>
如果您使用ActivityAlias来启动MainActivity,则元数据需要进入activity-alias块。或者,如果您希望整个应用使用.search.SearchDaemon
,则元数据可以位于application
块内。
See this commit在我的项目上展示了一个有效的设置。