24

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

Я создал поисковую конфигурацию и операцию поиска, как показано на странице 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) 
+1

Можете ли вы опубликовать весь код? у вас есть возможность поиска с возможностью поиска и поиска, как описано в документе? – rajpara

+0

, который является строкой Test.java:41? –

+0

Как написано выше: поиск и xml-поиск и активность поиска устанавливаются и добавляются в манифест. Строка 41 - это та, которую я прокомментировал с помощью «NullPointerException, которое было выбрано здесь, searchView равно null». – Taig

ответ

20

использовать этот способ, как и в link

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; 
    } 
+0

ok просто измените id to menu_item_search_1, чтобы разместить, затем очистить и построить проект и запустить его ... –

+0

http://www.edumobile.org/android/android-development/action-bar-search-view/ –

+0

http: // www. java2s.com/Code/Android/UI/UsageofSearchViewinanActionBarasamenuitem.htm –

47

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

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

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

    public class Search extends Activity {} 
    
  2. Добавить файл «searchable.xml» к вашим Рез/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» в вас Рез/меню Каталог

    <?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); 
        } 
    } 
    
+0

большое спасибо за этот очень хороший ответ! – samiq

+0

Спасибо! Действительно полезный ответ – blganesh101

+0

Самый яркий пример, который я видел –

0

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

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

Если вы используете таргетинг Android 2.x и используете android.support.v7.widget.SearchView проверьте это меню.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)); 
+2

Это должно быть отмечено как правильный ответ, первый ответ бессмысленно, что searchView является null, а не поисковым менеджером. –

+0

Спасибо за подсказку. Ты отреагировал на мой нынешний характер. – Craimasjien

2

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

6

SearchView getActionView returning null

Как и в ссылке, откройте файл XML меню и изменить

android:actionViewClass="android.widget.SearchView" 

в

app:actionViewClass="android.widget.SearchView" 

это работало для меня

+0

Это работает и для меня. Благодаря! – Winston

0

Прежде всего, создать 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, вы также можете использовать мой search widget, который берет список строк в виде списка массивов и отображает их в соответствии с введенным запросом. Когда пользователь выбирает конкретный результат, возвращается выбранный результат, который может быть получен в onActivityResult родительской активности.

Смежные вопросы