搜索小工具,NullPointer?

时间:2014-03-19 06:47:06

标签: 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_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" />

以下是它的实施方式。

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,但仍然无法弄清楚问题。

4 个答案:

答案 0 :(得分:6)

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

我也在使用以下依赖项,

for

这意味着我正在从compile 'com.android.support:support-v4:+' compile 'com.android.support:appcompat-v7:+' 而不是AppCompatActivity类扩展活动类。

所以在这段代码中,

Activity

这个,SearchView应该是SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); 而不是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

答案 1 :(得分:0)

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

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

注意更改,&#34; app:actionViewClass&#34;已更改为&#34;程序兼容性:actionViewClass&#34;

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

答案 2 :(得分:0)

在 res 中检查菜单文件夹。 在我的情况下创建了两个文件 第一个原创和第二个自动创建 21。 如果发生重复,删除其他文件问题解决

答案 3 :(得分:-1)

您应该从 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);

}