从MenuItem获取SearchView返回View而非SearchView问题
嘿,我之前也碰到过这个坑,给你几个靠谱的解决方案:
解决Fragment中SearchView类型不匹配问题
这个问题基本是两个核心原因导致的:要么是菜单配置没到位,要么是代码里的导入包和配置不匹配。
1. 先检查菜单XML的配置
确保你的menu_search.xml里的搜索项正确指定了actionViewClass,注意要用app:命名空间,并且写全类名(区分AndroidX和旧Support包):
<item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/ic_search" app:showAsAction="collapseActionView|ifRoom" app:actionViewClass="androidx.appcompat.widget.SearchView" />
如果你的项目用的是旧的support库,就把actionViewClass改成android.support.v7.widget.SearchView。
2. 核对代码中的导入包
在Fragment代码里,导入的SearchView必须和XML里的类路径完全一致:
// 用AndroidX的话就导这个 import androidx.appcompat.widget.SearchView; // 绝对不能混导成原生的 android.widget.SearchView
包路径不匹配的话,必然会出现View转SearchView的类型错误。
3. 显式强制类型转换(必要时)
如果上面两步都做了,但IDE还是提示类型不匹配,直接显式强转就行:
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ inflater.inflate(R.menu.menu_search, menu); final MenuItem searchItem = menu.findItem(R.id.search); // 显式强转成对应的SearchView SearchView searchView = (SearchView) searchItem.getActionView(); // 接下来就可以正常配置搜索监听了 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // 处理搜索提交逻辑 return true; } @Override public boolean onQueryTextChange(String newText) { // 处理搜索文本实时变化逻辑 return true; } }); }
最后别忘了在Fragment的onCreate或者onCreateView里加一句setHasOptionsMenu(true);,不然onCreateOptionsMenu根本不会被调用哦!
内容的提问来源于stack exchange,提问作者MHopstad
相关产品推荐
相关产品推荐

