Android: возврат поискового запроса к текущей активности - PullRequest
46 голосов
/ 23 февраля 2011

Я выполнил шаги, описанные в http://developer.android.com/guide/topics/search/search-dialog.html, чтобы реализовать функцию поиска в приложении для блокнота.

Моя проблема в том, что когда я заканчиваю поиск, открывается новое действие, захватывающее мой поисковый запрос.Но что мне действительно нужно, так это чтобы запрос возвращался к текущему действию, а не к новому.

Возможно ли это?

ОБНОВЛЕНИЕ:

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

Ответы [ 9 ]

60 голосов
/ 24 августа 2011

В вашем манифесте приложения вы должны определить текущую активность как активную для поиска.

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

Затем вы можете использовать строку для перезагрузки вашей активности, если она представляет собой список действий, вы можете вызвать свой код, который вы используете для загрузки данных и использовать строку в этом.

18 голосов
/ 03 октября 2013

Добавьте к 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' класс действий использует шаблон синглтона, и этот экземпляр будет корневым действием новой задачи.Давайте рассмотрим каждое значение: «стандартное»:

Можно создать несколько экземпляров класса активности и добавить несколько экземпляров для одной и той же или разных задач.Это обычный режим для большинства действий.

"singleTop":

Отличие от "стандартного" состоит в том, что экземпляр действия уже существует в верхней части текущей задачи иСистема направляет намерение на это действие, новый экземпляр не будет создан, потому что он вызовет метод onNewIntent () вместо создания нового объекта.

5 голосов
/ 28 февраля 2016

Я просто использую это: -

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 метода делают всю работу.

4 голосов
/ 01 апреля 2015

Я тоже столкнулся с той же проблемой, затем я написал этот код, и он решил мою проблему.

Реализуйте это в своей деятельности

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

Это полностью решит вашу проблему ..

Счастливое кодирование !!

2 голосов
/ 19 июня 2013

Коротко:

  1. Добавьте android:launchMode="singleTop" к определению searchable activity в AndroidManifest.xml
  2. Реализуйте onNewIntent в searchable activity и обработайте поиск там.
1 голос
/ 19 сентября 2013

в файле манифеста, добавьте:

android:launchMode="singleTop"

К вашей поисковой деятельности. Затем пусть ваша поисковая деятельность реализует SearchView.OnSuggestionListener наконец:

mSearchView.setOnSuggestListener(this)

таким образом вы можете обработать событие клика с предложением, не создавая новый экземпляр вашей поисковой активности.

1 голос
/ 25 августа 2011

Я последовал Подсказка Лахлана о "Вы можете использовать строку, чтобы перезагрузить свою деятельность", и, наконец, решил это.Поэтому, пожалуйста, сначала прочитайте пост Лахлана, а затем выполните следующие 3 шага «для перезагрузки своей деятельности»:

  1. Сохраните строку запроса в ApplicationContext.
  2. Завершить новое открытое действие поиска.
  3. Переопределите OnResume, получите только что сохраненную строку запроса, а затем обновите список.

Коды в List Activity:

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: Как объявить глобальные переменные? )

public class MyApp extends Application {

    private String mSearchText;

    public String getSearchText() {
        return mSearchText;
    }

    public void setSearchText(String searchText) {
        this.mSearchText = searchText;
    }
}

Не забудьте добавить свойство android:name=".MyApp" в ваше приложение в файле манифеста.Удачи!

0 голосов
/ 03 мая 2013

Новое действие не вызывается, если в 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 или другие хаки.

0 голосов
/ 27 мая 2011

Просто добавьте

<application>

  <meta-data 
     android:name="android.app.default_searchable"
     android:value="#Activity_Name" />

   <!-- All your activities, service, etc. -->

</application>

в ваш файл android_manifest.xml, где #Activity_Name - это имя действия, которое выполняет поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...