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

Две операции searchable.xml в одном AndroidManifest.xml

У меня есть Android-приложение, в котором есть несколько различных действий для просмотра статей и изображений, загруженных из RSS.

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

<activity android:name=".search.SearchResultsActivity"
    android:label="@string/search_results_activity_title" >
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
        android:resource="@xml/searchable_articles"/>
</activity>

и в <application />

<meta-data android:name="android.app.default_searchable"
    android:value=".search.SearchResultsActivity" />

Теперь я могу запустить диалог поиска из любой активности, и он запускает SearchResultsActivity.

Теперь я хотел бы иметь возможность искать изображения, когда пользователь является ImageListActivity, используя searchable_images.xml и используя значение по умолчанию везде.

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

<meta-data android:name="android.app.searchable"
    android:resource="@xml/searchable_images"/>

При нажатии кнопки поиска в ImageListActivity, я получаю поиск по умолчанию из searchable_articles.xml.

Если я изменяю default_searchable на SearchResultsImageActivity, поиск изображений всегда запускается, и поиск статьи никогда не запускается.

Если я полностью удалю элемент метаданных default_searchable и добавлю searchable метаданные только выбранные действия, поиск не будет запущен.

Я уверен, что это должно быть возможно, но я не знаю, что я делаю неправильно.

4b9b3361

Ответ 1

В обновлении файла Manifest тег активности ImageListActivity

<activity
    android:name=".ImageListActivity"
    ...

    <meta-data
        android:name="android.app.default_searchable"
        android:value=".SearchResultsImageActivity" />
</activity>

Итак, когда вы вызываете собственный поиск в ImageListActivity, он вызывается SearchResultsImageActivity и по умолчанию для других.

Предполагая, что SearchResultsImageActivity searchable.

Ответ 2

Один из способов сделать это - создать поддельные действия, а затем отключить действия, когда они вам понадобятся.

<activity android:name="activitySearchMain" />
  <activity android:name="activitySearchSub1">
    <intent-filter>
      <action android:name="android.intent.action.SEARCH" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.ALTERNATIVE" />
      <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
      <data android:scheme="user" />
    </intent-filter>
  </activity>
  <activity android:name="activitySearchSub2">
    <intent-filter>
      <action android:name="com.sample.twitter.action.SEARCH" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.ALTERNATIVE" />
      <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
      <data android:scheme="user" />
    </intent-filter>
</activity>

Создайте два класса, названных для вспомогательных действий.

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

Intent sourceIntent = getIntent();
Intent newIntent = new Intent(this, activitySearchSub2.class);
newIntent.setAction(activitySearchSub2.ACTION2);
newIntent.setData(sourceIntent.getData());
startActivity(newIntent);
finish();

и вызовите intents из onClick, когда нажата кнопка или какой-либо другой компонент щелкнет:

Ответ 3

Если вы переопределите функцию поиска только в этом действии, это должно помешать поисковому вызову перейти на уровень приложения. Возвращаемое значение управляет, если вызов размножается.

@Override
public boolean onSearchRequested() {
    onPromptSearch();
    return false;  // don't go ahead and show the search box
}