Intereting Posts
API-интерфейс API-интерфейса FloatMath.floor не установлен Тестирование жизненного цикла Невозможно создать проект, зависящий от библиотеки, после обновления до 14 ADT Как поместить значения из текстового представления в строку списка в фрагмент Что происходит с неподтвержденным сигналом тревоги AlarmManager, когда телефон просыпается? Android – показать сетчатые линии на камере Как я могу запросить root-доступ в Android? Как предотвратить множественные экземпляры активности при ее запуске с разными намерениями Как получить доступ к видеофайлам из папки sd card в приложении для Android Android Контекстная панель действий – выберите все / Отменить выбор всех Как выполнить приложение для Android в командной строке Android Studio? Правильное форматирование строки EditText Как добавить изображение в spinner в Android «Список подключенных устройств» пуст на Ubuntu 12.04 Наложение или скрыть панель инструментов при выборе копии / выреза

Как добавить SearchWidget в ActionBar?

Я пытаюсь добавить Search-ActionView в свое приложение (как описано здесь http://developer.android.com/guide/topics/search/search-dialog.html#UsingSearchWidget ). К сожалению, я продолжаю получать исключение NullPointerException, и мне сложно определить, что на самом деле происходит неправильно.

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

<menu xmlns:android="http://schemas.android.com/apk/res/android" > ... <item android:id="@+id/menu_item_search" android:actionViewClass="android.widget.SearchView" android:icon="@drawable/icon_search" android:showAsAction="always" android:title="@string/action_bar_button_search"> </item> </menu> 

Это метод, в котором выбрано исключение:

 public boolean onCreateOptionsMenu( Menu menu ) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate( R.menu.action_bar, menu ); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView(); // NullPointerException thrown here; searchView is null. searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); return super.onCreateOptionsMenu( menu ); } 

Полная трассировка стека:

 FATAL EXCEPTION: main java.lang.NullPointerException at com.example.activities.Test.onCreateOptionsMenu(Test.java:41) at android.app.Activity.onCreatePanelMenu(Activity.java:2444) at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:408) at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:759) at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:2997) at android.os.Handler.handleCallback(Handler.java:605) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4507) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) at dalvik.system.NativeStart.main(Native Method) 

Используйте этот способ, как в ссылке

 public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.action_bar, menu); MenuItem searchItem = menu.findItem(R.id.menu_item_search); SearchView searchView = (SearchView) searchItem.getActionView(); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); if(null!=searchManager ) { searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); } searchView.setIconifiedByDefault(false); return true; } 

Поскольку этот вопрос просматривается довольно часто, и я снова и снова наткнулся на ту же проблему, и здесь мы немного следим за тем, чтобы отслеживать все необходимые шаги для создания SearchWidget.

Однако есть одна сложная задача в SearchWidget: если вы используете жестко закодированные строки в файле searchable.xml вместо ресурсов, приложение будет разбиваться с запутанным сообщением об ошибке. Это заняло у меня слишком много часов в моей жизни …

  1. Создание действия для обработки результатов поиска

     public class Search extends Activity {} 
  2. Добавьте файл «searchable.xml» в каталог res / xml ( используйте ресурсы для подсказки и метки! )

     <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="@string/search_hint" android:includeInGlobalSearch="false" android:label="@string/search_label" android:searchSettingsDescription="@string/search_global_description" /> 
  3. Создайте правильный пункт меню «main.xml» в каталоге res / menu

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/options_menu_main_search" android:actionViewClass="android.widget.SearchView" android:icon="@drawable/icon_magnifier" android:showAsAction="always" android:title="Search"/> </menu> 
  4. Обновите свой Manifest.xml: добавьте активность поиска и укажите, какие действия могут получать поисковые запросы. Добавление <meta-data android:name="android.app.default_searchable" android:value=".app.Search" /> к узлу activity делает его доступным для поиска. Добавление его в узел application делает все действия доступными для поиска.

     <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <meta-data android:name="android.app.default_searchable" android:value=".app.Search" /> <activity android:name=".activities.Search" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> </application> 

  5. Добавьте SearchManager в ActionView в каждое действие, которое должно обеспечить SearchWidget

     public class Activity extends android.app.Activity { @Override public boolean onCreateOptionsMenu( Menu menu ) { getMenuInflater().inflate( R.menu.main, menu ); // Add SearchWidget. SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE ); SearchView searchView = (SearchView) menu.findItem( R.id.options_menu_main_search ).getActionView(); searchView.setSearchableInfo( searchManager.getSearchableInfo( getComponentName() ) ); return super.onCreateOptionsMenu( menu ); } } 

Если вы используете таргетинг на Android 2.x и используете android.support.v7.widget.SearchView, проверьте, что ваш файл menu.xml выглядит так (обратите внимание на пространство имен yourapp )

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/search" android:title="@string/search" android:icon="@drawable/ic_search" yourapp:showAsAction="always" yourapp:actionViewClass="android.support.v7.widget.SearchView" /> </menu> 

И в Управлении, где вы раздуваете меню, используйте:

 android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search)); 

SearchView getActionView возвращает null

Как в ссылке, откройте файл xml вашего меню и измените

 android:actionViewClass="android.widget.SearchView" 

в

 app:actionViewClass="android.widget.SearchView" 

Это сработало для меня

У меня тоже была такая же проблема. В моем случае измените android:actionViewClass на app:actionViewClass решила проблему (с xmlns:app="http://schemas.android.com/apk/res-auto" в <menu> ).

Эта проблема вызвана отсутствующим фильтром цели:

 <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> 

Прежде всего, создайте XML-файл, содержащий SearchWidget, в папку макета

 <?xml version="1.0" encoding="utf-8"?> <SearchView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/edit_query" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="textFilter" > </SearchView> 

Затем в своей деятельности извлеките панель действий

 android.support.v7.app.ActionBar actionBar = getSupportActionBar(); 

Затем добавьте ссылку на ваш поиск

  actionBar.setCustomView(R.layout.custom_action_bar); search = (EditText) actionBar.getCustomView().findViewById( R.id.edit_query); 

Затем установите параметр отображения для панели действий

 actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_HOME_AS_UP); 

Вот и все.

Btw, вы также можете использовать мой виджет поиска, который берет список строк в виде списка массивов и отображает их в соответствии с введенным запросом. Как только пользователь выбирает конкретный результат, возвращается выбранный результат, который может быть получен в onActivityResult родительской активности.