【问题标题】:NullPointerException on SearchView using AppCompat in Android 5.0在 Android 5.0 中使用 AppCompat 在 SearchView 上出现 NullPointerException
【发布时间】:2014-12-20 15:29:19
【问题描述】:

我正在使用所有 AppCompat 主题更新我的应用程序。我在这里得到一个空指针:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    MenuItem searchItem = menu.findItem(R.id.menu_search);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

    setupNewSearchView(searchItem, searchManager);

    return true;
}

private void setupNewSearchView(final MenuItem searchItem,
                                SearchManager searchManager) {
    final SearchView searchView = (SearchView) searchItem.getActionView();

   // Null at line below
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

   // Everything else below edited out
}

这是我的主要导入:

import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;

我认为更新到AppCompat 时必须更改此行是否正确?

final SearchView searchView = (SearchView) searchItem.getActionView();

更新

我改成这个了

   final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

同样的 null 结果...

更新 - 添加 XML

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

     <item
        android:id="@+id/menu_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always"
        android:title="search" />
    <item

</menu>

LogCat

10-24 11:49:07.040: E/AndroidRuntime(4846): java.lang.NullPointerException
10-24 11:49:07.040: E/AndroidRuntime(4846):     at com.---.---.MainFragmentActivity.setupNewSearchView(MainFragmentActivity.java:1300)
10-24 11:49:07.040: E/AndroidRuntime(4846):     at com.---.---.MainFragmentActivity.onCreateOptionsMenu(MainFragmentActivity.java:1292)
10-24 11:49:07.040: E/AndroidRuntime(4846):     at android.app.Activity.onCreatePanelMenu(Activity.java:2538)
10-24 11:49:07.040: E/AndroidRuntime(4846):     at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:275)
10-24 11:49:07.040: E/AndroidRuntime(4846):     at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276)
10-24 11:49:07.040: E/AndroidRuntime(4846):     at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79)
10-24 11:49:07.040: E/AndroidRuntime(4846):     at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:1056)
10-24 11:49:07.040: E/AndroidRuntime(4846):     at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1259)

【问题讨论】:

  • 添加菜单的 xml 代码。

标签: android nullpointerexception searchview android-appcompat


【解决方案1】:

使用支持库,您必须使用特定的菜单项类:MenuItemCompat

android.support.v4.view.MenuItemCompat

方法名称 (getActionView) 保持不变。

您的菜单 xml 应如下所示:

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

【讨论】:

  • 是的,我想就是这样。我没有在 XML 中更改它。
  • 越来越近,但并不完全;这次我添加了我的 XML 和完整的 logcat。编辑:等等,我忘了在actionViewClass 上加上“app”——修复了它……标记正确!
  • 感谢@KickingLettuce 这个评论让我很开心! :) :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2014-12-21
  • 2014-02-11
  • 2012-06-23
  • 2013-09-20
相关资源
最近更新 更多