Android基于DataBinding动态配置TabLayout未选中标签背景色咨询
实现方案
核心逻辑说明
TabLayout 本身提供了 setTabBackground(Drawable) 方法支持设置Tab项的背景,只是DataBinding的自动绑定规则无法直接把布局中传入的动态颜色值关联到这个方法上——因为默认的app:tabBackground属性只识别预定义的Drawable资源ID,不支持运行时动态构造Drawable。
你不需要依赖预先写死的xml选择器,完全可以在绑定适配器里根据动态传入的颜色值,运行时构造带状态判断的StateListDrawable,实现选中、未选中态的动态配色。
自定义绑定适配器代码
@BindingAdapter(value = ["dynamicTabSelectedBgColor", "dynamicTabUnselectedBgColor", "context"], requireAll = false) fun setDynamicTabBg(tabLayout: TabLayout, selectedBgColor: Int, unselectedBgColor: Int, context: Context) { val stateDrawable = StateListDrawable() // 配置选中态背景 val selectedColor = ContextCompat.getColor(context, selectedBgColor) stateDrawable.addState( intArrayOf(android.R.attr.state_selected), GradientDrawable().apply { setColor(selectedColor) } ) // 配置未选中态背景 val unselectedColor = ContextCompat.getColor(context, unselectedBgColor) stateDrawable.addState( intArrayOf(-android.R.attr.state_selected), GradientDrawable().apply { setColor(unselectedColor) } ) // 调用TabLayout原生方法设置动态生成的背景 tabLayout.tabBackground = stateDrawable }
注:如果需要给Tab背景加圆角、描边样式,直接在构造GradientDrawable时调用
setCornerRadius()、setStroke()方法即可,不需要额外写xml选择器。
布局文件绑定配置
在原有绑定逻辑基础上新增对应颜色变量,传入动态值即可:
<variable name="professionalTypeColor" type="Integer" /> <variable name="defaultUnselectedTabColor" type="Integer" /> <com.google.android.material.tabs.TabLayout android:id="@+id/tl_images" android:layout_width="0dp" android:layout_height="5dp" tabIndicatorColor="@{professionalTypeColor}" dynamicTabSelectedBgColor="@{professionalTypeColor}" dynamicTabUnselectedBgColor="@{defaultUnselectedTabColor}" context="@{context}" app:tabPaddingEnd="8dp" app:tabPaddingStart="8dp" />
注意事项
- 绑定适配器设置的动态背景会完全覆盖布局里预先写死的
app:tabBackground配置,不需要再保留原来的固定资源引用 - 设置
requireAll = false可以避免后续调整时,缺少单个参数导致的DataBinding编译报错 - 该逻辑和你之前实现的
tabIndicatorColor动态修改逻辑完全独立,不会产生冲突
内容的提问来源于stack exchange,提问作者joghm
相关产品推荐
相关产品推荐

