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个步骤“重新加载您的活动”:
- 将查询string保存在ApplicationContext中。
- 完成新打开的search活动。
- 覆盖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或其他黑客。
简述:
- 将
android:launchMode="singleTop"
到AndroidManifest.xml
的searchable activity
定义中 - 在
searchable activity
实现onNewIntent
并处理那里的search。