Android: возврат поискового запроса к текущей активности
Я выполнил шаги, описанные в http://developer.android.com/guide/topics/search/search-dialog.html, чтобы реализовать функцию поиска в моем приложении для блокнота.
Моя проблема заключается в том, что когда я заканчиваю поиск, открывается новый вид, который захватывает мой поисковый запрос. Но то, что я действительно хочу, это запрос, возвращаемый текущей активности, а не запуск нового.
Возможно ли это?
UPDATE:
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>
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 boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.menuItemSearch:
startSearch("", false, null, false);
break;
}
return true;
}
Даже если я использую кнопку поиска на телефоне, она не работает. Поэтому я считаю, что проблема в AndroidManifest.xml
Ответы
Ответ 1
В манифесте приложений вам нужно определить текущую активность как операцию поиска.
<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
}
}
Затем вы можете использовать строку для перезагрузки своей активности, если ее активность в списке вы можете вызвать свой код, который вы используете для загрузки данных, и используйте в нем строку.
Ответ 2
Добавить в 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" >
Причина:
Из этого сообщения:
Режим запуска активности имеет четыре допустимых значения:
"стандарт"
"SingleTop"
"SingleTask"
"SingleInstance"
Стандарт - это значение по умолчанию. Четыре значения делятся на две группы:
'standard' и 'singleTop' могут создавать экземпляры нескольких экземпляров, и экземпляр останется в одной и той же задаче.
Для "singleTask" или "singleInstance" класс активности использует шаблон singleton, и этот экземпляр будет корневой активностью новой задачи. Рассмотрим каждое значение:
"Стандарт":
Несколько экземпляров класса активности могут быть созданы и несколько экземпляров могут быть добавлены к одной и той же задаче или различным задачам. Это общий режим для большинства действий.
"SingleTop":
Отличие от "стандартного" заключается в том, что если экземпляр активности уже существует в верхней части текущей задачи и системные маршруты, предназначенные для этого действия, новый экземпляр не будет создан, потому что вместо этого он отключит метод onNewIntent() создания нового объекта.
Ответ 3
У меня также была проблема с той же проблемой, затем я написал этот код и решил мою проблему.
Реализуйте это в своей деятельности
**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 (меню меню)
@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);
}
Это полностью решит вашу проблему.
Счастливое кодирование!!
Ответ 4
Я просто использую это: -
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;
}
});
Это лучше всего использовать, когда вам нужно искать в списке и фильтровать элементы. Я никогда не пытаюсь реализовать функцию поиска, используя файл манифеста. 2 метода выполняют всю работу.
Ответ 5
Я последовал за ключом Lachlan к "После этого вы можете использовать строку для перезагрузки своей деятельности" и, наконец, это удалось. Поэтому сначала прочитайте пост Lachlan, а затем выполните следующие три шага "перезагрузить свою деятельность":
- Сохранить строку запроса в ApplicationContext.
- Завершите новую открытую операцию поиска.
- Переопределить OnResume, получить строку запроса, которую вы только что сохранили, а затем обновить список.
Коды в операции списка:
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 class: (Эта оригинальная идея отсюда: Android: как объявить глобальные переменные?)
public class MyApp extends Application {
private String mSearchText;
public String getSearchText() {
return mSearchText;
}
public void setSearchText(String searchText) {
this.mSearchText = searchText;
}
}
Не забудьте добавить свойство android:name=".MyApp"
к вашему приложению в файле манифеста. Удачи!
Ответ 6
Коротко:
- Добавьте
android:launchMode="singleTop"
в определение searchable activity
в AndroidManifest.xml
- Внесите
onNewIntent
в searchable activity
и обработайте поиск там.
Ответ 7
в файле манифеста, добавьте:
android:launchMode="singleTop"
К поисковой деятельности. Затем пусть ваша поисковая активность реализует SearchView.OnSuggestionListener
наконец:
mSearchView.setOnSuggestListener(this)
таким образом вы можете обработать событие с кликом предложения без создания нового экземпляра вашей активности поиска.
Ответ 8
Просто добавьте
<application>
<meta-data
android:name="android.app.default_searchable"
android:value="#Activity_Name" />
<!-- All your activities, service, etc. -->
</application>
в файле android_manifest.xml, где #Activity_Name - это имя действия, которое обрабатывает поиск.
Ответ 9
Он не вызывает новую активность, если установлен SearchView.OnSuggestionListener
в searchView, а переопределенные методы возвращают 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;
}
});
Не нужно принудительно активировать активность для одиночных или других хаков.