AndroidX加载SearchView时出现无法转ActionProvider的ClassCastException
根本原因
报错ClassCastException: androidx.appcompat.widget.SearchView cannot be cast to androidx.core.view.ActionProvider的触发原因是菜单配置文件中对搜索项的属性使用错误:
- 原配置中使用
app:actionProviderClass绑定SearchView,这个属性的设计用途是指定继承自ActionProvider的逻辑类,加载流程中会强制将实例化后的类强转为ActionProvider类型 - SearchView属于普通View组件,并未继承ActionProvider类,SupportMenuInflater在解析菜单XML、执行强转时就会直接崩溃,根本不会进入后续的菜单交互逻辑初始化流程。
具体修复方案
1. 修正menu_main.xml的菜单项配置
- 删除搜索项上错误的
app:actionProviderClass属性,替换为专门用来绑定交互视图的app:actionViewClass属性 - 移除搜索项上不兼容的老Holo主题配置
android:theme="@android:style/Theme.Holo.Light.DarkActionBar",该属性在AppCompatActivity+AndroidX场景下会引发主题错乱,无实际作用
修正后的搜索菜单项配置示例:
<item android:id="@+id/action_search" android:orderInCategory="100" android:title="Search" android:icon="@drawable/ic_search" app:showAsAction="always" app:actionViewClass="androidx.appcompat.widget.SearchView" />
2. 优化Activity中菜单初始化逻辑
- 移除重复的
menu.findItem(R.id.action_search)调用,先获取MenuItem实例,再通过实例获取关联的SearchView,减少冗余查询 - 确保代码中导入的SearchView类为
androidx.appcompat.widget.SearchView,不要导入系统原生的android.widget.SearchView,避免版本兼容问题
优化后的核心逻辑片段:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_main, menu); SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE); // 单次查询获取MenuItem实例 MenuItem searchMenuItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) searchMenuItem.getActionView(); // 后续的SearchView初始化逻辑保持不变 searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setQueryHint("Поиск последний новостей ..."); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { if (query.length() > 2) { onLoadingSwipeRefresh(query); } return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); searchMenuItem.getIcon().setVisible(false, false); return true; }
易混淆属性说明
app:actionProviderClass:仅用于指定继承自ActionProvider的逻辑实现类,典型使用场景为绑定androidx.appcompat.widget.ShareActionProvider实现分享菜单功能app:actionViewClass:用于指定任意View子类作为菜单项的交互视图,典型使用场景为绑定SearchView、自定义布局视图作为菜单项的action视图
内容的提问来源于stack exchange,提问作者Сергей Беляков
相关产品推荐
相关产品推荐

