SearchView 展开抛出空指针异常

Posted

技术标签:

【中文标题】SearchView 展开抛出空指针异常【英文标题】:SearchView expand throws null pointer exception 【发布时间】:2012-09-21 01:48:47 【问题描述】:

我正在三星 Galaxy Tab (P7500) (android 4.0.4) 中测试应用程序,我在尝试在操作栏中展开默认 SearchView 小部件时收到此错误。在 4.0.4 更新之前,我的应用程序运行良好。

错误日志:

09-29 14:18:28.460: E/AndroidRuntime(2814): java.lang.NullPointerException
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.widget.SearchView.adjustDropDownSizeAndPosition(SearchView.java:1244)
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.widget.SearchView.access$300(SearchView.java:92)
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.widget.SearchView$5.onLayoutChange(SearchView.java:336)
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.view.View.layout(View.java:11486)
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.view.ViewGroup.layout(ViewGroup.java:4232)
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1633)
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1417)
09-29 14:18:28.460: E/AndroidRuntime(2814):     at android.view.View.layout(View.java:11477)
....

我试图找出这个错误。我检查了 4.0.3 和 4.0.4 源(API 15)和android.widget.SearchView 文件的第 1244 行方法结束:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.4_r2.1/android/widget/SearchView.java?av=f

我认为三星修改了这个源文件。

之后,我尝试使用原始 4.0.4 源和调试信息来确定空指针在哪里。我发现问题可能在这里:

mQueryTextView.getDropDownBackground().getPadding(dropDownPadding);

mQueryTextView.getDropDownBackground() 返回 null,因为 SearchView.this.mQueryTextView.mPopup.mPopup.mBackground 为 null。

我不确定这是否完全错误,因为三星已经修改了源代码。而且我不知道接下来我能做什么。

这是我的 ActionBar 菜单 XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_settings"
        android:title="@string/menu_settings"
        android:orderInCategory="100" />

    <item android:id="@+id/search"
        android:title="Search"
        android:showAsAction="ifRoom"
        android:actionViewClass="android.widget.SearchView" />
    <item 
        android:id="@+id/favorites" 
        android:title="Favourites"
        android:icon="@drawable/favorites">

    </item>
    <item 
        android:id="@+id/recent" 
        android:title="Recent"
        android:icon="@drawable/recent">

    </item>
    <item 
        android:id="@+id/downloaded" 
        android:title="Downloaded"
        android:icon="@drawable/downloaded">

    </item>
</menu>

【问题讨论】:

【参考方案1】:

此问题似乎与在操作栏 SearchView 中应用于 EditText 的样式有关。

您可以通过删除已应用于 EditText 的任何样式来解决此问题,例如:

res/values/styles.xml

<item name="android:editTextStyle">@style/editor</item>

然后转到布局 XML 中的每个 EditText 视图并直接应用样式:

<EditText style="@style/editor" />

【讨论】:

对于 SO 版主:此答案重复:http://***.com/a/22295139/2178259

以上是关于SearchView 展开抛出空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

为啥非空列表会抛出空指针异常?

Android Canvas drawcolor 抛出空指针异常

HashCode 抛出空指针异常

Play 2.4 Finder 抛出空指针异常

SAX XML 解析器抛出空指针异常

JOOQ“IN”查询抛出空指针异常