为什么自定义AppCompatSpinner的simple_spinner_dropdown_item下拉项透明?
解答
1. android.R.layout.simple_spinner_dropdown_item的背景来源
这个系统布局本身没有内置固定背景,它的样式完全由当前主题的属性控制,核心读取的是主题中的android:spinnerDropDownItemStyle属性配置的样式。
两个项目表现不一致的核心原因是基础主题不同:如果你的项目A用的是Theme.MaterialComponents系列父主题,项目B用的是Theme.AppCompat或者系统原生主题,两个主题自带的spinnerDropDownItemStyle默认值就不一样,有的默认配置了白色背景+点击 ripple,有的默认就是透明背景,最终就会出现你看到的差异。
你当前页面下拉项和页面背景同色,就是因为当前主题的spinnerDropDownItemStyle默认是透明,直接透出了下层的页面背景。
2. 动态修复方案(无需修改XML配置)
你不想硬编码XML的话,可以选以下任意一种方案实现统一效果:
- 方案1:给下拉项设置系统默认选择器背景
在getDropDownView的inflate逻辑后新增一行,读取系统默认的列表项背景:// 放在inflater.inflate之后即可 val typedValue = TypedValue() context.theme.resolveAttribute(android.R.attr.selectableItemBackground, typedValue, true) view.setBackgroundResource(typedValue.resourceId) - 方案2:创建Spinner时指定统一主题上下文
动态生成自定义Spinner实例时,用带AppCompat默认Spinner样式的Context包装,强制统一下拉样式:val themedContext = ContextThemeWrapper( activityContext, androidx.appcompat.R.style.Widget_AppCompat_Spinner_DropDown ) val yourCustomSpinner = YourCustomSpinner(themedContext) - 方案3:直接给下拉弹窗设置固定背景
重写自定义Spinner的弹窗背景方法,强制下拉列表整体为白色:class YourCustomSpinner @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : AppCompatSpinner(context, attrs) { override fun getPopupBackground(): Drawable? { return ColorDrawable(Color.WHITE) } }
内容的提问来源于stack exchange,提问作者BabyishTank
相关产品推荐
相关产品推荐

