Java 搜索小部件,空指针?
您好,我在应用程序中实现搜索小部件时遇到问题。它似乎无法找到菜单项的“actionview”,但它可以很好地找到该项 我四处寻找答案,但还没有找到明确的解决方案 这是我用XML声明的菜单Java 搜索小部件,空指针?,java,android,search,Java,Android,Search,您好,我在应用程序中实现搜索小部件时遇到问题。它似乎无法找到菜单项的“actionview”,但它可以很好地找到该项 我四处寻找答案,但还没有找到明确的解决方案 这是我用XML声明的菜单 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/group_
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/group_search_box"
android:title="@string/search_label"
android:icon="@drawable/ic_action_action_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView" />
这是我要添加的库,也许我添加了一个不正确的库
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)
我一直在跟踪文档,但仍然无法找出问题所在 您应该从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);
}
今天,我面对同样的问题,消除了如下困惑: 我还使用了以下依赖项
compile 'com.android.support:support-v4:+'
compile 'com.android.support:appcompat-v7:+'
这意味着我从AppCompatActivity
扩展活动类,而不是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
而且
<item
android:id="@+id/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@android:drawable/ic_search_category_default"
android:title="Search"
app:showAsAction="always|collapseActionView" />
注意,,
是的,
app:actionViewClass
不是android:actionViewClass
我一直面临着同样的问题,答案中提供的任何解决方案都不适合我。但是这个代码的改变对我来说很有效。
使用
请注意更改,“app:actionViewClass”已更改为“appcompat:actionViewClass”
对我来说效果不错,希望对你也一样。检查res中的菜单文件夹。 在我的例子中,创建了两个文件 第一个原始和第二个自动创建21。
删除另一个文件问题如果发生重复,请解决嘿,谢谢你的帮助,似乎不起作用。目前,这段代码在一个片段中,因为我只希望当片段出现在屏幕上时,搜索才可用。因此,getActivities就应运而生。作为一个测试,我把所有的代码都带到了主活动本身中,我仍然有完全相同的问题,我可以找到菜单项,但是当我尝试获取actionView时,我没有找到指针。你解决了这个问题吗?由于某种原因,这种崩溃对我来说是相当罕见的。我也得到了这个例外。当它发生时,它是完全随机的,这使得很难诊断问题。@StarWind什么部分不起作用,我不知道你的问题啊,它似乎是这个应用程序兼容的东西。我正在尝试使用“android:Theme.Material”,它不适用于AppCompative活动。真遗憾,我真的需要两者。。但我已经做了好几个小时了。@StarWind把它作为一个新问题加上,你在这方面遇到了麻烦,我弄明白了。对于我未来的同行来说,如果没有应用程序兼容库,你的理由是不正确的。将
app
更改为appCompat
没有任何作用。这样做之所以有效,是因为app:actionViewClass=“android.support.v7.widget.SearchView”。我制作了一个android:actionViewClass
,这就是为什么它对我不起作用的原因。@AliKazi我没有给出任何理由,我只是分享了对我起作用的解决方案。虽然我应该提供一个理由。这都与您正在使用的SDK版本有关。对于我的版本(Sdk版本25),从“android:”到“app:”的更改不起作用,但从“android:”到“appcompat:”的更改非常有效。对于您正在使用的版本,从“安卓”更改为“应用”有效。即使我也无法理解兼容性方面的这种差异。@captain.am您的解决方案最初不起作用,因为您没有在此处引用正确的命名空间属性xmlns:appcompat=”http://schemas.android.com/apk/res-auto“
,如果您将其命名为appcompat
或appcompat
<item
android:id="@+id/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@android:drawable/ic_search_category_default"
android:title="Search"
app:showAsAction="always|collapseActionView" />
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:appcompat="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/group_search_box"
android:title="@string/search_label"
android:icon="@drawable/ic_action_action_search"
appcompat:showAsAction="ifRoom|collapseActionView"
appcompat:actionViewClass="android.support.v7.widget.SearchView" />