Xamarin.Forms修改ScrollBar颜色时自定义ScrollBarColorEffect报错如何解决
Xamarin.Forms ScrollBar颜色修改Effect报错解决方案
问题核心原因
- 你当前使用的反射调用安卓非公开API(
mScrollCache、setVerticalThumbDrawable)的方案,在Android 10(API 29)及以上版本已经被系统限制访问,这是报错的直接诱因 - 代码中存在潜在空引用风险:提前将
Element强转为ScrollView后未做空判断就直接调用Effects属性
修复后的安卓端实现代码
[assembly: ResolutionGroupName("MPlay")] [assembly: ExportEffect(typeof(MPlay.Droid.ScrollBarColorEffect), nameof(MPlay.Droid.ScrollBarColorEffect))] namespace MPlay.Droid { public class ScrollBarColorEffect : PlatformEffect { protected override void OnAttached() { UpdateUI(); } protected override void OnDetached() { } void UpdateUI() { if (Element is not Xamarin.Forms.ScrollView scrollView || Control is not AndroidX.Core.Widget.NestedScrollView nativeScrollView) return; var effect = scrollView.Effects.OfType<Core.Effects.ScrollBarColorEffect>().FirstOrDefault(); if (effect == null) return; var androidColor = effect.ScrollBarColor.ToAndroid(); // 适配不同安卓版本的公开API修改滚动条颜色 if (Build.VERSION.SdkInt >= BuildVersionCodes.Q) { nativeScrollView.VerticalScrollbarThumbDrawable?.SetTint(androidColor); nativeScrollView.HorizontalScrollbarThumbDrawable?.SetTint(androidColor); } else { nativeScrollView.ScrollBarThumbTintList = ColorStateList.ValueOf(androidColor); } // 可选配置:调整滚动条显示逻辑保证修改效果可见 nativeScrollView.ScrollbarFadingEnabled = false; nativeScrollView.ScrollbarDefaultDelayBeforeFade = 2000; } } }
其他说明
共享层代码和XAML调用逻辑无需修改,上述方案全部使用安卓公开API实现,不会触发系统权限限制报错。如果需要适配API23以下的极低版本,可通过自定义安卓样式设置scrollbarThumbVertical属性实现需求。
内容的提问来源于stack exchange,提问作者user6473719
相关产品推荐
相关产品推荐

