【问题标题】:Getting a null SearchView获取空的 SearchView
【发布时间】:2014-07-03 14:51:35
【问题描述】:

我知道这已经被问过很多次了,但我已经阅读了所有这些并尝试改变很多东西,但没有一个有效。
我正在编写一个仅支持 android 4 及更高版本的应用程序,因此我不需要支持库 v7(虽然以前它已包含在内)。我的代码非常简单:

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

    searchView.setOnQueryTextListener(new SearchViewQueryTextListener());
    return super.onCreateOptionsMenu(menu);
}

我在第 4 行收到 NullPointerException。 Here 是我的仓库的链接,所以你可以看到任何你想要的东西。我认为我自己,问题在于MainActivity 类或menu.xml 或应用程序清单。

请帮忙,我卡住了。

【问题讨论】:

  • 仅此而已,我猜我们将无能为力。为什么不在 searchView == null 上调用方法之前检查它?
  • 我已经为我的整个应用添加了链接!正如我所说,第 6 行的 searchView 为空。
  • 如果为null,不要在其上调用方法。
  • 你说你不需要支持库,那你为什么要使用它?您在 xml 中使用 android.support.v7.widget.SearchView,在代码中使用 MenuItemCompat,因此您显然在使用支持库。
  • @darnmason:我已经更正了,仍然出现同样的错误

标签: android searchview


【解决方案1】:

您的main.xml 菜单文件资源中有一个小错字。您写了android.widget.searchview,这应该是android.widget.SearchView(大小写很重要,因为android SDK 中没有任何searchview 小部件解释缺少(空)小部件)。

【讨论】:

    【解决方案2】:

    代码的问题是SearchView不是MenuItem所以不能被menu.findItem获取。您必须先获取用于搜索的菜单项,然后再获取您的SearchView

    将失败的行替换为 -

    mSearchMenuItem = menu.findItem(R.id.action_search);
    mSearchView = (EnglishVerbSearchView) MenuItemCompat.
                   getActionView(mSearchMenuItem);
    

    在哪里,

    R.id.action_search 是您在菜单中的搜索项的 ID。

    此外,由于您使用的是 compat 库,因此您的菜单 xml 文件应包含 yourapp 命名空间。

    例如——

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
        <item android:id="@+id/action_search"
          android:title="@string/action_search"
          android:icon="@drawable/action_search"
          yourapp:showAsAction="always|collapseActionView"
          yourapp:actionViewClass="android.support.v7.widget.SearchView" />
    </menu>
    

    注意:

    应用程序可以是任何东西,在上面的例子中它是yourapp。它必须指向 http://schemas.android.com/apk/res-auto 架构。

    说明您的问题的典型示例如下所示:

    Android-nullpointerexception-on-searchview-in-action-bar.

    为了清楚问题,上面包含了代码。

    更新:

    要清除您在 xml 中的错误,请查看您的 xml 的以下代码 -

    <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!--     xmlns:yourapp="http://schemas.android.com/apk/res-auto" -->
    
        <!-- Search / will display always -->
        <item android:id="@+id/action_search"
            android:title="@string/action_search"
            android:icon="@drawable/ic_action_search"
            android:showAsAction="ifRoom|collapseActionView"
            android:actionViewClass="android.widget.searchview"/>
    

    只需将上面的代码替换为以下代码---

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:yourapp="http://schemas.android.com/apk/res-auto">
            <!-- Search / will display always -->
            <item android:id="@+id/action_search"
                android:title="@string/action_search"
                android:icon="@drawable/ic_action_search"
                yourapp:showAsAction="ifRoom|collapseActionView"
                yourapp:actionViewClass="android.widget.searchview"/>
    

    请注意第 2、7 和 8 行的更改。

    来源: Action View Bar.

    希望对您有所帮助!

    【讨论】:

    • 正如我在问题和评论中所说,我不会使用 v7 支持库并将其从项目中删除。
    • @alireza - 更新了答案。
    • 我照你说的做了,但仍然得到那个该死的异常。
    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2013-09-05
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2015-08-18
    • 2016-03-09
    相关资源
    最近更新 更多