搜索小工具,NullPointer?

我在我的应用程序中实现搜索小部件时遇到问题。 它似乎无法找到菜单项的“actionview”,但它正好找到该项目。

我环顾四周寻找答案,并没有看到明确的解决方案。

这是我用XML声明的菜单

  

以下是它的实现方式。

 SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); MenuItem searchMenuItem = menu.findItem(R.id.group_search_box); SearchView searchView = (SearchView) searchMenuItem.getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName())); 

这是我正在添加的库,也许我添加了一个不正确的库?

 compile 'com.android.support:support-v4:+' compile 'com.android.support:appcompat-v7:+' 

最后这里是崩溃日志

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference at com.example.myapp.fragments.GroupFragment.onCreateOptionsMenu(GroupFragment.java:88) at android.app.Fragment.performCreateOptionsMenu(Fragment.java:1780) at android.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1927) at android.app.Activity.onCreatePanelMenu(Activity.java:2539) at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224) at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:436) at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:800) at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:221) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:543) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 

我已经跟着文档到了T,仍然无法弄清楚问题。

我今天遇到了同样的问题,摆脱了如下的困惑,

我也使用以下依赖项,

 compile 'com.android.support:support-v4:+' compile 'com.android.support:appcompat-v7:+' 

这意味着我正在从AppCompatActivity而不是Activity类扩展Activity类。

所以在这段代码中,

 SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); 

这个,SearchView应该是, android.support.v7.widget.SearchView不是android.widget.SearchView 。 这就是你得到的原因,

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference 

并且,

  

请注意,它是app:actionViewClass NOT android:actionViewClass

我一直面临同样的问题,答案中提供的解决方案都没有为我工作。 但是代码中的这种变化对我有用。 使用

   

注意更改,“app:actionViewClass”已更改为“appcompat:actionViewClass”。

对我有用,希望它也适合你。

你应该从searchManager中删除getActivity() ,如下所示,

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { MenuItem searchItem = menu.findItem(R.id.searchMenuItem); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(searchItem); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); }