Два searchable.xml действия в одном AndroidManifest.xml - PullRequest
17 голосов
/ 19 октября 2010

У меня есть приложение для 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 только к выбранным действиям, поиск не запускается.

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

Ответы [ 3 ]

4 голосов
/ 26 июля 2012

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

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

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

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

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

1 голос
/ 07 июня 2011

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

<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();

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

0 голосов
/ 28 сентября 2011

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

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