Android中SearchView调用getActionView返回null引发空指针异常
我来帮你排查这个崩溃问题,你遇到的java.lang.NullPointerException是因为menu.findItem(R.id.search)返回了null,进而调用getActionView()时触发了空指针。咱们一步步来修复:
1. 最关键的修复:Menu XML里的ID属性笔误
你写的menu.xml里,item标签的ID属性写错了:
<!-- 错误写法 --> <item xmln:id="@+id/search" ...>
这里的xmln:id是笔误,应该改为android:id,这个错误直接导致menu.findItem(R.id.search)找不到对应的菜单项,返回null。修正后的item标签应该是:
<item android:id="@+id/search" android:icon="@drawable/ic_search" app:showAsAction="always" android:title="search" <!-- 顺便修正了title里的拼写错误 --> app:actionViewClass="android.support.v7.widget.SearchView" />
2. 确保Menu XML的命名空间正确
你的menu根标签需要声明android和app两个命名空间,否则app:showAsAction和app:actionViewClass这些属性无法被正确识别。完整的menu.xml应该是这样:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/search" android:icon="@drawable/ic_search" app:showAsAction="always" android:title="search" app:actionViewClass="android.support.v7.widget.SearchView" /> </menu>
3. 匹配SearchView的类路径与依赖
如果你已经迁移到AndroidX,那么android.support.v7.widget.SearchView需要替换为androidx.appcompat.widget.SearchView,同时确保你的build.gradle(Module级别)里有正确的AppCompat依赖:
implementation 'androidx.appcompat:appcompat:1.6.1'
如果还在使用旧的Support库,要确保依赖中包含com.android.support:appcompat-v7,但更推荐迁移到AndroidX。
4. 优化Java代码,增加安全判断
为了避免后续再出现类似空指针,建议在代码中增加非空判断,同时修正菜单的返回值(返回true表示菜单需要显示):
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); final MenuItem ourSearchItem = menu.findItem(R.id.search); // 先判断菜单项是否存在 if (ourSearchItem != null) { SearchView sv = (SearchView) ourSearchItem.getActionView(); // 再判断SearchView是否初始化成功 if (sv != null) { sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { Toast.makeText(getApplicationContext(), query, Toast.LENGTH_LONG).show(); return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); } } return true; // 返回true表示菜单已创建并需要显示 }
5. 检查Activity的基础配置
确保你的Activity继承自AppCompatActivity(AndroidX)或者android.support.v7.app.AppCompatActivity(Support库),并且在AndroidManifest.xml中使用的是AppCompat系列主题,比如:
<activity android:name=".YourActivity" android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
因为Support/AndroidX的SearchView需要依赖AppCompat主题才能正常初始化ActionView。
按照以上步骤修复后,你的SearchView应该能正常初始化,不会再触发空指针异常了。
内容的提问来源于stack exchange,提问作者Ahmed EL-barbri

