Android:将搜索查询返回到当前活动
我按照上面描述的步骤在记事本应用程序中实现搜索功能 我的问题是,当我完成搜索时,会打开一个新的活动来捕获我的搜索查询。但我真正想要的是将查询返回到当前活动,而不是启动新的活动 这可能吗 更新: AndroidManifest.xmlAndroid:将搜索查询返回到当前活动,android,search,Android,Search,我按照上面描述的步骤在记事本应用程序中实现搜索功能 我的问题是,当我完成搜索时,会打开一个新的活动来捕获我的搜索查询。但我真正想要的是将查询返回到当前活动,而不是启动新的活动 这可能吗 更新: AndroidManifest.xml <activity android:name="MyNotepad" android:label="@string/app_name"> <int
<activity android:name="MyNotepad"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.SEARCH"></action>
</intent-filter>
<meta-data android:resource="@xml/searchable" android:name="android.app.searchable"></meta-data>
</activity><activity android:name="Preferences" android:label="Preferences" >
</activity>
即使我使用手机上的搜索按钮,它也不起作用。因此,我认为问题出在AndroidManifest.xml中,只需添加
<activity android:name="MyNotepad"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.SEARCH"></action>
</intent-filter>
<meta-data android:resource="@xml/searchable" android:name="android.app.searchable"></meta-data>
</activity><activity android:name="Preferences" android:label="Preferences" >
</activity>
<application>
<meta-data
android:name="android.app.default_searchable"
android:value="#Activity_Name" />
<!-- All your activities, service, etc. -->
</application>
在android_manifest.xml文件中,#Activity_Name是处理搜索的活动的名称。在应用程序清单中,需要将当前活动定义为可搜索活动
<activity android:name="BrowseItems" android:label="@string/browseitems"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/itemsearchable" />
</activity>
然后,您可以使用字符串重新加载活动,如果是列表活动,您可以调用用于加载数据的代码,并在其中使用字符串。我在“您可以使用字符串重新加载活动”之后,终于解决了这个问题。因此,请先阅读Lachlan的帖子,然后采取以下3个步骤“重新加载您的活动”:
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String searchText = intent.getStringExtra(SearchManager.QUERY);
((MyApp)this.getApplicationContext()).setSearchText(searchText);
this.finish();
}
}
protected void onResume() {
super.onResume();
String searchText = ((MyApp)this.getApplicationContext()).getSearchText();
//refresh your list here...
}
MyApp类:(这个原始想法来自这里:)
不要忘记在清单文件中将属性
android:name=“.MyApp”
添加到您的应用程序中。祝你好运 如果在SearchView上设置了SearchView.OnSuggestionListener
,并且重写的方法返回true(),则不会启动新活动。您可以在onCreateOptions菜单()
实现中执行此操作,如下所示:
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionSelect(int position) {
return true;
}
@Override
public boolean onSuggestionClick(int position) {
CursorAdapter selectedView = searchView.getSuggestionsAdapter();
Cursor cursor = (Cursor) selectedView.getItem(position);
int index = cursor.getColumnIndexOrThrow(SearchManager.SUGGEST_COLUMN_TEXT_1);
searchView.setQuery(cursor.getString(index), true);
return true;
}
});
无需将活动强制为singleTop或其他黑客。简要说明:
android:launchMode=“singleTop”
添加到AndroidManifest.xml中的可搜索活动定义中
可搜索活动中执行onNewIntent
,并在那里处理搜索
在清单文件中,添加:
android:launchMode="singleTop"
到您的搜索活动。然后,让您的搜索活动实现SearchView.OnSuggestionListener
最后:
mSearchView.setOnSuggestListener(this)
通过这种方式,您可以在不创建搜索活动新实例的情况下处理建议单击事件。在可搜索活动中添加到AndroidManifest.xml:
<activity android:name="BrowseItems" android:label="@string/browseitems"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/itemsearchable" />
</activity>
android:launchMode="singleTop"
因此,您的AndroidManifest.xml如下所示:
<activity android:name="MyNotepad"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.SEARCH"></action>
</intent-filter>
<meta-data android:resource="@xml/searchable" android:name="android.app.searchable"></meta-data>
</activity><activity android:name="Preferences" android:label="Preferences" >
:
活动启动模式有四个有效值:
“标准”
“单顶”
“单一任务”
“单实例”
“标准”是默认值。这四个值分为两组:
“standard”和“singleTop”可以实例化多个活动实例,该实例将保留在同一个任务中。
对于“singleTask”或“singleInstance”,activity类使用singleton模式,该实例将是新任务的根活动。让我们检查每个值:
“标准”:
可以实例化活动类的多个实例,并且可以将多个实例添加到同一个任务或不同的任务中。这是大多数活动的通用模式
“单顶”:
与“标准”不同的是,如果活动实例已存在于当前任务的顶部,并且系统将意向路由到此活动,则不会创建新实例,因为它将触发onNewIntent()方法,而不是创建新对象。我也面临同样的问题,然后我写了这段代码,它解决了我的问题
在您的活动中实施这一点
**implements SearchView.OnQueryTextListener, SearchView.OnCloseListener**
在类中添加此函数:
private void setupSearchView()
{
searchView.setIconifiedByDefault(true);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
if (searchManager != null)
{
List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();
// Try to use the "applications" global search provider
SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
for (SearchableInfo inf : searchables)
{
if (inf.getSuggestAuthority() != null && inf.getSuggestAuthority().startsWith("applications"))
{
info = inf;
}
}
searchView.setSearchableInfo(info);
}
searchView.setOnQueryTextListener(this);
searchView.setOnCloseListener(this);
}
这将彻底解决你的问题
快乐编码 我只是用这个:-
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
//on submit
return false;
}
@Override
public boolean onQueryTextChange(String s) {
//get all text changes
return false;
}
});
当您必须在listview中搜索并且必须筛选出项目时,最好使用此选项。我从不使用清单文件实现搜索功能。这两种方法可以完成所有工作。是的,这是可能的。如果您提供您当前的代码,我们可以给出更具体的答案。您好,成功了吗?我也在寻找同样的东西。太遗憾了,我没有足够的代表,否则我很乐意为这个问题增加一笔奖金。嗨,鲁伊沃,你能详细说明你的答案吗?我相信这里最重要的一点是使用android:launchMode=“singleTop”
。如果您的可搜索活动已经位于活动堆栈顶部,Android将不会启动新活动。您将在当前活动中收到搜索意图(通过onNewIntent
)。感谢您的回答,因为我只使用android:launchMode=“singleTop”。我已尝试将查询和查询结果活动设置为相同的活动。声明为singleTop
,AppCompativeActivity仍然没有收到任何意图@onNewIntent()。所以我试试这个,它很管用!通过实现实现SearchView.OnQueryTextListener
,您可以更紧密地与SearchView合作。
**implements SearchView.OnQueryTextListener, SearchView.OnCloseListener**
private void setupSearchView()
{
searchView.setIconifiedByDefault(true);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
if (searchManager != null)
{
List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();
// Try to use the "applications" global search provider
SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
for (SearchableInfo inf : searchables)
{
if (inf.getSuggestAuthority() != null && inf.getSuggestAuthority().startsWith("applications"))
{
info = inf;
}
}
searchView.setSearchableInfo(info);
}
searchView.setOnQueryTextListener(this);
searchView.setOnCloseListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
//restoreActionBar();
// Associate searchable configuration with the SearchView
//SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
//searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
setupSearchView();
return super.onCreateOptionsMenu(menu);
}
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
//on submit
return false;
}
@Override
public boolean onQueryTextChange(String s) {
//get all text changes
return false;
}
});