FAB调用setBackgroundTintColorList后setImageResource失效问题求助
问题原因与解决方案
这个问题其实和FloatingActionButton的内部实现逻辑有关:当你调用setBackgroundTintColorList()时,FAB会重新构建并初始化它的背景Drawable组件,这个过程会触发视图的重绘流程。如果紧接着调用setImageResource(),后者的图标变更会被前者的重绘操作覆盖——简单来说,就是UI刷新的时序问题导致图标设置的操作“没赶上”最终的绘制。
解决办法
这里有几个靠谱的方案可以解决这个问题:
调换调用顺序:先设置图标,再修改背景色调。这样图标先完成设置,后续的背景色调变更不会影响已经设置好的图标:
setImageResource(R.drawable.your_target_icon); setBackgroundTintColorList(yourColorStateList);用
post()延迟执行图标设置:借助View的post()方法,让图标设置的操作在当前UI刷新周期结束后再执行,确保背景色调的变更已经完成:setBackgroundTintColorList(yourColorStateList); fab.post(() -> { fab.setImageResource(R.drawable.your_target_icon); });直接操作图标Drawable:如果上面的方法还不行,可以尝试获取FAB的前景Drawable,直接修改它的资源,避免重新设置带来的时序问题:
Drawable icon = ContextCompat.getDrawable(context, R.drawable.your_target_icon); fab.setImageDrawable(icon); fab.setBackgroundTintColorList(yourColorStateList);
本质上,这个问题就是视图刷新的时序冲突——FAB内部处理背景色调的逻辑会干扰后续的图标设置,调整执行顺序或者延迟执行就能解决。
内容的提问来源于stack exchange,提问作者Abdul Rehman
相关产品推荐
相关产品推荐

