2014-11-20 4 views
52

Поскольку я implented приложение Compat мой SearchView больше не работает:SearchView не работает, так как приложение Compat

Process: com.laurenswuyts.witpa, PID: 26666 
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference 
      at com.laurenswuyts.witpa.Activities.Events.EventActivity.onCreateOptionsMenu(EventActivity.java:75) 
      at android.app.Activity.onCreatePanelMenu(Activity.java:2820) 
      at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:275) 
      at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276) 
      at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79) 
      at android.support.v7.widget.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:49) 
      at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:459) 
      at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:69) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Так NullPointer для SearchView в то время как у меня есть это:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.event_main, menu); 

     // Get the SearchView and set the searchable configuration 
     // Associate searchable configuration with the SearchView 
     SearchManager searchManager = 
       (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = 
       (SearchView) menu.findItem(R.id.action_search).getActionView(); 
     searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 


     return super.onCreateOptionsMenu(menu); 
    } 

И в моем menu У меня есть следующее:

<!-- Search Widget --> 
    <item android:id="@+id/action_search" 
     android:title="@string/action_search" 
     android:icon="@drawable/ic_action_search" 
     app:showAsAction="always" 
     android:actionViewClass="android.support.v7.widget.SearchView"/> 

Я понятия не имею, почему это не работает, но это произошло с тех пор, как я начал использовать приложение co mpat 21.

С уважением,

ответ

215

Try с использованием пространства имен пользовательских app для вашего actionViewClass тоже:

app:actionViewClass="android.support.v7.widget.SearchView"/> 
+0

Wow, который сработал, можете объяснить вам, почему я должен использовать приложение вместо android? – Laurenswuyts

+2

@Laurenswuyts с тех пор, как вы начали использовать библиотеку поддержки, некоторые атрибуты теперь должны быть определены с помощью собственного пространства имен. Это пространство имен определено в вашем файле меню. Более подробную информацию можно найти в [docs] (http://developer.android.com/training/custom-views/create-view.html#customattr). – Simas

+9

Я использую приложение: пространство имен, и оно работало на отладочной версии, но вызывает ту же ошибку в режиме выпуска, когда у меня есть minifyEnabled true в gradle.build, любое предложение? –

14

Это также может произойти, если вы включили ProGuard и это чередование Визитки SearchView класса. Вам нужно будет изменить настройки proguard, чтобы сохранить класс.

См. this вопрос для получения более подробной информации.

10

после некоторого времени игры «run & ошибка« Я нашел решение. Похоже, что элемент UI не является причиной того, что вызывает ошибку. После установки поиска в QueryListener он работает хорошо. Вот код:

активность, которая содержит SearchBar:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 

     SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

      @Override 
      public boolean onQueryTextSubmit(String s) { 
       Log.d(TAG, "onQueryTextSubmit "); 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String s) { 
       Log.d(TAG, "onQueryTextChange "); 
       return false; 
      } 
     }); 

     return true; 
    } 

searchable.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
             android:label="@string/app_name" 
             android:hint="@string/search_hint"/> 

и "SearchBar" в menu.xml

 <item 
      android:id="@+id/search" 
      android:title="@string/search_title" 
      android:icon="@drawable/abc_ic_search_api_mtrl_alpha" 
      app:showAsAction="collapseActionView|ifRoom" 
      app:actionViewClass="android.support.v7.widget.SearchView"/> 

... 

И последнее, но не менее важное, манифест (но это должно быть ясно) ...

<activity 
     android:name=".activities.MainActivity" 
     android:label="@string/title_activity_main"> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable"/> 
    </activity> 

больше информации ->Docs

8

подмигнули дополнительную информацию Simas ответа. Я нашел это в другой ответ (https://stackoverflow.com/a/33400808/4949671), и это было очень важно для решения моего исключения:

Обратите внимание, что она есть, app:actionViewClassНЕ android:actionViewClass

25

Добавьте следующую строку в Proguard-правила.про файл, расположенный внутри приложения папка:

-keep класс android.support.v7.widget.SearchView {*; }

+1

работал как шарм ... Спасибо, человек! –

+0

Большая помощь. Новая система Proguard. Но это выровняло много – Jigar

0

После того, как вы нажали на результат, ваше приложение ожидает, что операция еще не завершена и пытается перейти к аргументу Intent.

SearchView.OnSuggestionListener и возвращает true, который уведомляет ваше приложение о завершении операции щелчка.

 searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { 

      @Override 
      public boolean onSuggestionClick(int position) { 
       return true; 
      } 

      @Override 
      public boolean onSuggestionSelect(int position) { 
       return false; 
      } 
     }); 
1

Если вы используете progurd, то вы должны добавить следующую строку в proguard-rules.pro файл

-keep общественного класса android.support.v7.widget. ** {*; }

или

-keep класс android.support.v7.widget.SearchView {*; }

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