Подтвердить что ты не робот

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

4b9b3361

Ответ 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;
        }
    });

Не нужно принудительно активировать активность для одиночных или других хаков.