自应用程序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; } });