自应用程序compat以来,Searchview不起作用

由于我已经实施了应用程序compat,所以我的searchview不再工作:

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) 

所以,当我有它的情况下为searchview的nullpointer:

 @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); } 

在我的菜单中,我有这个:

 <!-- 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"/> 

我不知道为什么它不能工作了,但自从我开始使用应用程序compat 21以来发生了。

问候,

尝试使用您的actionViewClass的自定义app命名空间:

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

将以下行添加到app文件夹内的proguard-rules.pro文件中:

-keep类android.support.v7.widget.SearchView {*; }

这也可能发生,如果你有proguard启用,并剥离SearchView类。 你需要修改proguard设置来保持这个类。

看到这个问题的更多细节。

经过一段时间玩“运行和错误”,我发现一个解决scheme..看起来像UI元素不是什么原因造成的错误。 将search设置为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"/> 

menu.xml中的“SearchBar”

  <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> 

更多信息 – > 文档

这是Simas回答的附加信息。 我发现在另一个答案( https://stackoverflow.com/a/33400808/4949671 )这是解决我的例外是非常重要的:

注意,它是, app:actionViewClass 不是 android:actionViewClass

当你点击一个结果后,你的应用程序期待一个操作没有完成,并试图进一步进入一个意图的参数。

SearchView.OnSuggestionListener并返回true ,通知您的应用程序点击操作已完成。

  searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { @Override public boolean onSuggestionClick(int position) { return true; } @Override public boolean onSuggestionSelect(int position) { return false; } });