【问题标题】:Search Widget, NullPointer?搜索小部件,NullPointer?
【发布时间】:2014-04-25 06:04:56
【问题描述】:

您好,在我的应用程序中实现搜索小部件时遇到问题。它似乎无法找到菜单项的“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 操作,但仍然无法找出问题所在。

【问题讨论】:

  • 你解决了吗?出于某种原因,这种崩溃对我来说非常罕见。
  • 我也遇到了这个异常。它发生时完全是随机的,因此很难诊断问题。

标签: java android search


【解决方案1】:

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

我也在使用以下依赖,

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

【讨论】:

  • @StarWind 哪一部分不行,不知道你的问题
  • 啊它似乎是这个应用程序兼容的东西。我正在尝试使用不适用于 AppCompatActivity 的“android:Theme.Material”。真可惜,因为我真的需要两者..但我已经在这几个小时了..
  • @StarWind 将其添加为您遇到问题的新问题
  • 我明白了。对于我未来的对手stackoverflow.com/questions/21585326/…如何在没有应用兼容库的情况下做到这一点
【解决方案2】:

我也遇到过同样的问题,答案中提供的解决方案都不适合我。但是代码中的这种更改对我有用。 使用

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

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

对我有用,希望对你也有用。

【讨论】:

  • 您的理由不正确。将 app 更改为 appCompat 没有任何作用。这个工作的原因是因为app:actionViewClass="android.support.v7.widget.SearchView"。我做到了android:actionViewClass,这就是为什么它对我不起作用。
  • @AliKazi 我没有给出任何理由,我只是分享了对我有用的解决方案。虽然我应该提供一个理由。这都与您使用的 SDK 版本有关。对于我的版本(Sdk 版本 25),从“android:”到“app:”的更改不起作用,但“android:”到“appcompat:”的效果非常好。对于您使用的版本,从“android”更改为“app”工作。就连我也无法理解这种兼容性的多样性。
  • @captain.am 你的解决方案最初不起作用,因为你没有在这里引用正确的命名空间属性xmlns:appcompat="http://schemas.android.com/apk/res-auto",如果你将它命名为appcompatappIncompat 是无关紧要的
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 嘿,感谢您的帮助,似乎没有奏效。目前此代码位于片段内,因为我只希望当片段在屏幕上时该搜索可用。因此getActivity。作为一项测试,我将所有代码都带入了 Main Activity 本身,但我仍然遇到完全相同的问题,我可以找到菜单项,但是当我尝试获取 actionView 时出现空指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多