Android RatingBar颜色重复问题求助:底部弹窗评分条颜色异常如何修复?
我之前在Bottom Sheet里用RatingBar的时候也踩过这个颜色重复的坑,大概率是系统默认样式和双重状态设置冲突导致的——你同时设置了android:isIndicator="true"和setEnabled(false),这两个属性叠加会让RatingBar的绘制层重复,出现颜色重叠的异常。下面是几个亲测有效的修复方案:
方案1:移除冗余的状态设置(最推荐)
XML里的android:isIndicator="true"本身就已经让RatingBar变成不可交互的只读指示器了,完全不需要再调用setEnabled(false),这行代码是多余的,反而会触发系统的双重状态绘制逻辑。
修改后的MainActivity.java代码:
RatingBar ratingBar = (RatingBar) findViewById(R.id.rating_bar); ratingBar.setRating(4); // 删掉ratingBar.setEnabled(false),因为isIndicator已经实现了只读效果
方案2:替换为专门的指示器样式
如果因为某些原因必须保留setEnabled(false),可以把RatingBar的样式从系统默认的?android:attr/ratingBarStyle换成专为只读场景设计的?attr/ratingBarStyleIndicator,这个样式不会和禁用状态产生绘制冲突。
修改后的XML布局代码:
<RatingBar android:id="@+id/rating_bar" android:saveEnabled="false" android:isIndicator="true" android:rating="0" style="?attr/ratingBarStyleIndicator" <!-- 替换为指示器专属样式 --> android:layout_width="wrap_content" android:layout_height="wrap_content"/>
方案3:强制软件绘制解决硬件加速冲突
如果以上方案都没解决,可能是Bottom Sheet的半透明背景或硬件加速导致的绘制缓存问题,给RatingBar加上android:layerType="software"强制用软件绘制即可:
<RatingBar android:id="@+id/rating_bar" android:saveEnabled="false" android:isIndicator="true" android:rating="0" style="?attr/ratingBarStyleIndicator" android:layerType="software" <!-- 强制软件绘制 --> android:layout_width="wrap_content" android:layout_height="wrap_content"/>
问题根源补充
系统默认的ratingBarStyle是给可交互的评分条设计的,当你同时开启isIndicator和enabled=false时,系统会叠加“禁用态”和“指示器态”两层绘制,导致颜色重复;而ratingBarStyleIndicator是专门为只读场景优化的,只会绘制一层指示器样式,不会出现这个问题。
内容的提问来源于stack exchange,提问作者Hitrene

