Dialog中加载SearchView触发InflateException错误求助
Android Dialog中加载自定义样式SearchView崩溃问题解决
问题原因
崩溃根源是abc_search_view布局中的ImageView无法解析属性索引13,本质是Dialog的Context主题缺少SearchView内部控件所需的AppCompat主题属性,具体触发场景:
- 自定义SearchView样式
WallSearchView仅继承控件样式Widget.AppCompat.Light.SearchView,未关联完整的AppCompat主题上下文,导致内部ImageView的drawable属性无法解析 - 创建Dialog时使用了Application Context而非Activity的Context,Application Context默认不携带Activity级别的主题属性
- 样式中混用
android:命名空间和AppCompat属性,部分系统属性未被正确映射
解决方案
方案1:修正SearchView样式的继承与属性
将样式改为继承主题Overlay,并补充核心控件样式引用,确保主题上下文完整:
<style name="WallSearchView" parent="ThemeOverlay.AppCompat.Light"> <item name="colorControlActivated">@color/light_black</item> <item name="hintTextColor">@color/gray</item> <item name="android:textSize">@dimen/_12sdp</item> <item name="android:fontFamily">@font/inter_medium</item> <item name="android:cursorVisible">true</item> <item name="android:textCursorDrawable">@null</item> <!-- 关联SearchView核心控件样式 --> <item name="searchViewStyle">@style/Widget.AppCompat.Light.SearchView</item> </style>
同时将布局中SearchView的android:theme改为app:theme(AppCompat官方推荐用法):
<androidx.appcompat.widget.SearchView android:id="@+id/searchView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerVertical="true" android:focusable="true" android:paddingHorizontal="@dimen/_8sdp" android:iconifiedByDefault="false" android:singleLine="true" app:theme="@style/WallSearchView" app:queryHint="Search for country" app:searchHintIcon="@null" />
方案2:确保Dialog使用Activity Context
创建Dialog时必须传入当前Activity的Context,禁止使用Application Context:
// 错误写法 // val dialog = Dialog(applicationContext) // 正确写法 val dialog = Dialog(this@AddOrdersActivity) dialog.setContentView(R.layout.common_list_layout)
方案3:替换为Material Components SearchView
如果项目已依赖Material库,直接使用官方推荐的Material SearchView,避免AppCompat主题兼容问题:
<style name="WallSearchView" parent="Widget.MaterialComponents.SearchView"> <item name="hintTextColor">@color/gray</item> <item name="android:textSize">@dimen/_12sdp</item> <item name="android:fontFamily">@font/inter_medium</item> </style>
布局中替换控件:
<com.google.android.material.search.SearchView android:id="@+id/searchView" android:layout_width="match_parent" android:layout_height="match_parent" app:theme="@style/WallSearchView" app:queryHint="Search for country" />
方案4:清理冲突依赖
移除项目中重复、版本冲突的依赖(如同时引入retrofit1/2、okhttp2/3),确保appcompat与material版本匹配:
// 保留稳定兼容的依赖版本 implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.11.0") // 删除重复依赖:com.squareup.retrofit:retrofit:1.9.0、com.squareup.okhttp:okhttp:2.7.5等
内容的提问来源于stack exchange,提问作者Foram Shah
相关产品推荐
相关产品推荐

