Мой вариант использования следующий: в действии A у меня есть панель действий со сворачиваемым SearchView. Когда пользователь задает свой запрос и нажимает кнопку «поиск», я хотел бы показать действие B с результатами. Я не могу этого сделать, вот мой код:
searchchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/action_search_hint"
android:label="@string/app_name"/>
Деятельность А:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}
AndroidManifest для действий A и B:
<activity
android:name=".ActivityA">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".ActivityB">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
Хауэрвер, что бы я ни пытался, getSearchableInfo в A всегда возвращает null.
Такое чувство, что я чего-то не понимаю. Единственный способ заставить getSearchableInfo () возвращать значение, отличное от null, - это поместить фильтр намерения SEARCH и доступные для поиска метаданные в действие A в манифесте. Но затем, когда я нажимаю кнопку «поиск», другой экземпляр действия A запускается снова поверх текущего, что определенно не то, что я хочу. Думаю, я мог бы добавить singleTop к A и обработать действие SEARCH в onNewIntent и запустить B, но обычно я не хочу, чтобы A был singleTop, я хочу значение по умолчанию. Или я?
Я попытался добавить это к A в манифесте (как предлагалось в некоторых других потоках):
<meta-data
android:name="android.app.default_searchable"
android:value=".ActivityB" >
</meta-data>
Что я делаю неправильно?
РЕДАКТИРОВАТЬ: я заменил строку getComponentName () в A следующим:
searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, ActivityB.class)));
и вроде работает так, как я хочу! Я здесь что-то не так делаю или это правильный путь? Я немного сомневаюсь, потому что это нигде не упоминается!
getSearchableInfo(componentName)
принимает один аргумент, который является «действием, для которого нужно получить доступную для поиска информацию». В вашем случае вам нужен ActivityB, поэтому созданиеComponentName
, указывающего на ActivityB, является правильным способом. - person hidro   schedule 02.02.2015