Виджет панели поиска не запускает поисковую активность
Я пытаюсь реализовать поиск в своем приложении для Android, используя виджет панели поиска в панели действий.
Я следую
http://developer.android.com/guide/topics/search/search-dialog.html http://developer.android.com/guide/topics/ui/actionbar.html
учебники, чтобы сделать это.
У меня есть два вида деятельности, связанных с поиском. У активности SearchBar есть панель действий, и AcceptSearch - это моя поисковая активность. Несмотря на то, что я объявил, какое действие было активным для поиска, запрос не пересылается в AcceptSearch и действие не запускается.
Я настроил панель поиска так, чтобы подсказка панели поиска появлялась, когда виджет пуст, но подсказка также никогда не появляется. Вот мой код
Панель поиска
public class SearchBar extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.search_bar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
//Inflate the options menu from XML
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
return true;
}
AcceptSearch
public class AcceptSearch extends ListActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
//Get the intent, verify the action and get the query
Intent intent = getIntent();
if(Intent.ACTION_SEARCH.equals(intent.getAction()))
{
String query = intent.getStringExtra(SearchManager.QUERY);
//Start the search
doMySearch();
}
}
Searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_label"
android:hint="@string/search_hint">
</searchable>
options_menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:title="Help"
android:id="@+id/menu_help"
android:showAsAction="always"
/>
<item
android:title="Categories"
android:id="@+id/menu_cats"
android:showAsAction="always"
/>
<item
android:id="@+id/menu_search"
android:title="Search with Searchlet"
android:icon="@drawable/ic_action_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="android.widget.SearchView"/>
</menu>
манифест
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.searchlet"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".SplashScreenActivity"
android:label="@string/title_activity_splash_screen"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".AcceptSearch">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
<activity android:name=".SearchBar"
android:label="@string/app_name">
<intent-filter>
<action android:name="com.example.searchlet.CLEARSCREEN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
Я верю, что это вся необходимая информация, чтобы воссоздать ситуацию.
Спасибо всем заранее. Я ценю.
7 ответов
У меня была похожая проблема. Я следовал учебнику Гроккинга, и деятельность так и не началась. Я попробовал решения Индрека, которые мне подходят.
Вы должны быть уверены, что у вас есть правильные метаданные под правильным родителем. Метаданные
<meta-data
android:name="android.app.default_searchable"
android:value=".NameSearchActivity" />
должно быть под заявкой. Следующие метаданные
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
должен находиться под параметром активности поиска внутри AndroidManifest.xml.
В поисковой активности я сделал то, что было сказано в руководстве, связанном ранее для управления стеком активности. Я надеюсь, что это решение работает для всех с той же проблемой.
В учебниках отсутствует одна важная часть. Вы должны добавить <meta-data android:name="android.app.default_searchable" android:value=".MySearchActivityName" />
внутри <application>
теги.
У меня были проблемы с SearchView
не бери SearchActivity
оказалось, что это проблема пакета / каталога.
Если SearchableActivity
не находится в том же каталоге, что и Activity
хостинг вашего SearchView
Вам нужно изменить:
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
в
searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, SearchableActivity.class)));
Пау Арландис Мартинес, спасибо. Ваше решение работает хорошо, и учебник со стеком активности полезен. Я положил в <application>
Разделите эти метаданные:
<meta-data
android:name="android.app.default_searchable"
android:value=".NameSearchActivity" />
И я заметил, что метод @Override onQueryTextSubmit должен возвращать false, чтобы начать поиск активности. В противном случае кнопка поиска на виртуальной клавиатуре не работает.
Для тех, у кого все еще есть эта проблема, я также сталкивался с этой проблемой: если доступная для поиска активность расширяет AppCompatActivity, которую действие не запустит, я изменила ее, чтобы вместо нее расширить действие, и это сработало.
Вам не хватает метаданных в файле ".SearchBar" Activity of Manifest, который указывает на действие ".AcceptSearch".
Добавьте следующие метаданные в действие.SearchBar:
<!-- search widget target activity-->
<meta-data android:name="android.app.default_searchable"
android:value=".AcceptSearch" />
Вот обновленный код для манифеста активности.SearchBar.
<activity android:name=".SearchBar"
android:label="@string/app_name">
<!-- search widget target activity-->
<meta-data android:name="android.app.default_searchable"
android:value=".AcceptSearch" />
<intent-filter>
<action android:name="com.example.searchlet.CLEARSCREEN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Подсказка и метка в searchable.xml являются ссылками, а не жестко закодированными строками.
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/search_hint"
android:label="@string/app_name"/>
Таким образом, действие, которое содержит виджет SearchView, должно быть объявлено в манифесте.
<activity
android:name="ACTIVITY PATH WHICH CONTAINS SEARCHVIEW WIDGET">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value=".SearchableActivity" />
</activity>
Декларация для поиска активности в манифесте.
<activity android:name=".SearchableActivity">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>