Android:将search查询返回到当前活动

我遵循http://developer.android.com/guide/topics/search/search-dialog.html上描述的步骤来实现记事本应用程序中的searchfunction。

我的问题是,当我完成search一个新的活动打开捕获我的search查询。 但我真正想要的是查询返回到当前的活动,而不是开始一个新的。

这可能吗?

更新:

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> 

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>
<?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> 

JAVA代码

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_pad); Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); Toast.makeText(getApplicationContext(), query, Toast.LENGTH_LONG).show(); } }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_pad); Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); Toast.makeText(getApplicationContext(), query, Toast.LENGTH_LONG).show(); } } 
@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.menuItemSearch: startSearch("", false, null, false); break; } return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.menuItemSearch: startSearch("", false, null, false); break; } return true; } 

即使我使用手机上的searchbutton,它也不起作用。 我为此相信,问题出在AndroidManifest.xml中

在您的应用程序清单中,您需要将当前活动定义为可search的活动。

 <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> 

然后,您使用以下代码,该代码来自http://developer.android.com/guide/topics/search/search-dialog.html#LifeCycle

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); // Do work using string } } 

然后,您可以使用该string来重新加载您的活动,如果列表活动可以调用您的代码来加载数据并使用该string。

在您的可search活动中添加到AndroidManifest.xml:

 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”

“标准”是默认值。 四个值分为两组:

“standard”和“singleTop”可以实例化多个活动实例,实例将保持在同一个任务中。 对于“singleTask”或“singleInstance”,活动类使用单例模式,该实例将成为新任务的根活动。 我们来看看每个值:“标准”:

可以实例化活动类的多个实例,并可以将多个实例添加到相同的任务或不同的任务。 这是大多数活动的共同模式。

“singleTop”:

与“标准”的不同之处在于,如果活动的实例已经存在于当前任务的顶部,并且系统向该活动路由意图,则不会创build新的实例,因为它将触发onNewIntent()方法而不是创build新的对象。

我也面临同样的问题,然后我写这个代码,它解决了我的问题。

在你的活动中实现这一点

 **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); } 

调用onCreateOptionsMenu(菜单菜单)中的function

 @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; } }); 

这是最好的使用时,你必须search一个列表视图,并必须筛选出项目。 我从来没有通过使用清单文件来实现searchfunction。 这两种方法完成所有的工作。

我跟着Lachlan的线索 “你可以使用string来重新加载你的活动”,并最终解决了这个问题。 所以请先阅读Lachlan的post,然后采取以下3个步骤“重新加载您的活动”:

  1. 将查询string保存在ApplicationContext中。
  2. 完成新打开的search活动。
  3. 覆盖OnResume,获取刚刚保存的查询string,然后刷新列表。

列表活动中的代码:

 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:如何声明全局variables? )

 public class MyApp extends Application { private String mSearchText; public String getSearchText() { return mSearchText; } public void setSearchText(String searchText) { this.mSearchText = searchText; } } 

不要忘记在Manifest文件中将属性android:name=".MyApp"到您的应用程序中。 祝你好运!

在清单文件中,添加:

 android:launchMode="singleTop" 

到您的search活动。 然后,让你的search活动最后执行SearchView.OnSuggestionListener

 mSearchView.setOnSuggestListener(this) 

通过这种方式,您无需创buildsearch活动的新实例即可处理build议点击事件。

只需添加

 <application> <meta-data android:name="android.app.default_searchable" android:value="#Activity_Name" /> <!-- All your activities, service, etc. --> </application> 

在您的android_manifest.xml文件中,#Activity_Name是处理search的活动的名称。

如果searchView上的SearchView.OnSuggestionListener被设置,并且重写的方法返回true( 覆盖默认行为 ),它不会引发新的活动。 你可以在onCreateOptionsMenu()实现中这样做:

  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或其他黑客。

简述:

  1. android:launchMode="singleTop"AndroidManifest.xmlsearchable activity定义中
  2. searchable activity实现onNewIntent并处理那里的search。