Не удается найти searchview в панели действий для работы

Я довольно новичок в разработке java и android; И я работал над приложением в witch. Я хочу панель действий с SearchView . Я просмотрел примеры Google, но я не могу заставить его работать. Я должен делать что-то неправильно, и я собираюсь отказаться от разработки приложений: DI искал, но я не нашел ничего полезного. Может быть, вы, ребята, можете мне помочь 🙂

Проблема : я открываю окно поиска так, как должно, но после этого ничего не происходит вообще, я заметил, что мой searchManager.getSearchableInfo (getComponentName ()) возвращает null. Также мой намек, который я дал, не отображается в моем окне поиска, ведьма заставляет меня думать, что, возможно, приложение не может найти мой searchable.xml? Достаточно поговорить 🙂

MainActivity.java

 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, 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())); return true; } } 

searchable.xml

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="@string/search_hint" android:label="@string/app_label"> </searchable> 

Androidmanifest

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.searchapp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".SearchableActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </application> </manifest> 

SearchableActivity.java

 package com.example.searchapp; import android.app.ListActivity; import android.app.SearchManager; import android.content.Intent; import android.os.Bundle; import android.util.Log; public class SearchableActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); // 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); doMySearch(query); } } private void doMySearch(String query) { Log.d("Event",query); } } 

И вот ссылка на упомянутый проект, я был бы бесконечно благодарен, если бы кто-то помог мне с этим!

Исходный код

Solutions Collecting From Web of "Не удается найти searchview в панели действий для работы"

Ваша проблема в вашем AndroidManifest. У меня это было почти так же, как и у вас, потому что это то, что я получаю после документации. Но это неясно или ошибочно.

Наблюдая за источником API Demos, я обнаружил, что метаданные «android.app.searchable» должны поступать в вашу «результаты», а в основном действии (или в том случае, когда вы размещаете SearchView) вы указываете на другой, android.app.default_searchable».

Вы можете увидеть его в следующем файле, который является манифестом из моего тестового проекта:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <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=".SearchActivity" /> </activity> <activity android:name=".SearchActivity" android:label="@string/app_name" > <!-- This intent-filter identifies this activity as "searchable" --> <intent-filter> <action android:name="android.intent.action.SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <!-- This metadata entry provides further configuration details for searches --> <!-- that are handled by this activity. --> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> </application> 

Также важно, чтобы подсказка и метка в файле searchable.xml были ссылками, а не жестко закодированными строками.

Надеюсь, он решает вашу проблему. Мне потребовался целый день, чтобы понять это 🙁

Руководства Android явно говорят:

 // Assumes current activity is the searchable activity searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

Что в вашем случае НЕ ИСТИНА. Потому что вы не хотите искать в MainActivity, но в SearchableActivity. Это означает, что вы должны использовать это ComponentName вместо метода getComponentName ():

 ComponentName cn = new ComponentName(this, SearchableActivity.class); searchView.setSearchableInfo(searchManager.getSearchableInfo(cn)); 

Также кажется, что оба атрибута android: hint и android: label ДОЛЖНЫ быть ссылками на строки в strings.xml. Быть ленивым и жестко кодировать значения строк, похоже, не работает вообще 🙂

Т.е. не делать:

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="Search for something..." android:label="My App"> </searchable> 

Но определенно сделайте (как правильно сделал OP):

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="@string/search_hint" android:label="@string/app_label"> </searchable> 

Если вы используете Android Studio,

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

Часть может не работать.

Написать полное имя пакета

 <meta-data android:name="android.app.default_searchable" android:value="com.example.test.SearchActivity" /> 

Будьте осторожны с «xml / searchable.xml». Если вы сделали HARD CODE с android:hint и android:label Это не сработает. Ха-ха Должно быть:

 <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="@string/app_name" android:label="@string/search_lb" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"/> 

Фактически нет необходимости использовать «недостающую часть», как описано в ответах выше. Этот метод (с помощью SearchView ) работает точно так же, как говорят официальные документы до использования виджета «Поиск» . Здесь небольшое изменение необходимо сделать следующим образом:

Свойства в SearchableInfo используются для отображения ярлыков, подсказок, предложений, создания намерений для запуска экранов результатов поиска и контроля других возможностей, таких как голосовая кнопка ( docs ).

Таким образом, объект SearchableInfo мы передаем в SearchView.setSearchableInfo(SearchableInfo s) должен содержать правильные ссылки на целевую активность, которая должна отображаться для отображения результатов поиска. Это делается путем передачи имени ComponentName из нашей целевой активности. Один конструктор для создания ComponentName

 public ComponentName (String pkg, String cls) 

pkg и cls – имена пакетов и имена классов целевой активности для запуска результатов поиска. Обратите внимание, что:

pkg должен указывать на имя корневого пакета вашего проекта и,

cls должно быть полностью квалифицированным именем класса (т. cls вещи)

например:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); // Get the SearchView and set the searchable configuration String pkg = "com.example.musicapp" String cls = "com.example.musicapp.search.SearchActivity" ComponentName mycomponent = new ComponentName(pkg,cls); SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(mycomponent)); searchView.setIconifiedByDefault(false); //if using on actionbar return true; } 

В зависимости от ваших требований взгляните на другие конструкторы ComponentName .

Убедитесь, что ваш файл searchables.xml находится в правильном месте (т. res/xml/ папке res/xml/ ) и что тот же файл не содержит ошибок – в противном случае вы обнаружите, что (SearchManager)getSystemService(Context.SEARCH_SERVICE).getSearchableInfo(componentName) вернет null, нарушив функцию поиска.

(Кроме того, убедитесь, что вы правильно установили имя_компьютера, потому что пример, показанный в руководстве для Android, предназначен только для тех случаев, когда вы выполняете поиск и показываете запросы в той же Деятельности.)

Двойная проверка, если соответствующая запись (т.е. search_hint и app_label) присутствует в значениях / strings.xml

например

  <string name="app_label">FunApp</string> <string name="search_hint">Caps Off</string>