我现在已经坚持了一段时间。我在SO
查看了其他答案,但他们没有帮助我解决我的问题。
我的问题是onSearchRequested()
没有调用搜索对话框。我无法弄清楚我的搜索是怎么回事......
相关代码如下......
清单
<activity
android:name=".SearchableActivity"
android:label="@string/app_name"
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>
/res/xml/searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint" >
</searchable>
我有strings.xml
中定义的字符串资源。
SearchableActivity类
public class SearchableActivity extends ListActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SEARCH", "HERE");
handleIntent(getIntent());
}
public void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
public void onListItemClick(ListView l, View v, int position, long id) {
// call the appropriate detail activity
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doSearch(query);
}
}
private void doSearch(String queryStr) {
Toast.makeText(getApplicationContext(), queryStr, Toast.LENGTH_LONG).show();
}
}
调用搜索的活动中的一段代码...
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getTitle().equals("Search")) {
Toast.makeText(getApplicationContext(), "Search = "+onSearchRequested(), Toast.LENGTH_LONG).show();
return onSearchRequested();
} else {
return false;
}
}
onSearchRequested()
正在返回true
。但SearchableActivity
未被调用。任何帮助表示赞赏。
非常感谢。
已更新
没关系!我想通了!解决方案是将meta-data
移到activity
标记之外和application
标记内。已添加以下内容作为遇到此问题的人的答案。
感谢。
答案 0 :(得分:7)
您需要声明搜索活动的完整路径
<meta-data
android:name="android.app.default_searchable"
android:value="com.example.search.SearchableActivity" />
答案 1 :(得分:3)
搞定了。
解决方法是将meta-data
移到activity
标记之外和application
标记内,如下所示...
<meta-data
android:name="android.app.default_searchable"
android:value=".SearchableActivity" />
<activity
android:name=".SearchableActivity"
android:label="@string/app_name"
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>
谢谢!
答案 2 :(得分:3)
除非您希望应用程序中的每个活动都提供搜索对话框,否则您不必将元数据移到活动标记之外。它可能不适合你的原因是因为你把元数据放到错误的活动中并将其移到外面解决问题。
请勿将ResearchActivity
与调用它的Activity混淆:
<activity
android:name=".SearchableActivity"
android:label="@string/title_activity_searchable"
android:launchMode="singleTop">
<meta-data
android:name="android.app.default_searchable"
android:value=".SearchableActivity" />
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
它没有错误,但不起作用。工作示例:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<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=".SearchableActivity"
android:label="@string/title_activity_searchable"
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>
</application>
MainActivity
是提供搜索对话框的活动(也可以是search widget),SearchableActivity
是用户请求搜索并调用onSearchRequested()
后开始的活动。
答案 3 :(得分:1)
<强>更新强>
您必须override
onNewIntent()
将清单改为
<activity
android:name=".SearchableActivity"
android:label="@string/app_name"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:resource="@xml/searchable"
android:value=".SearchableActivity" />
</activity>