daimajia SliderLayout无法加载HTTP协议图片问题求助
解决daimajia SliderLayout无法加载HTTP图片的问题
原因分析
Android 9.0(API 28)及以上系统默认禁止明文HTTP网络请求,而daimajia的SliderLayout默认使用的图片加载逻辑未适配该限制;同时Slider内部默认图片加载器未做HTTP兼容处理,而你使用的Glide/Picasso已通过自身配置适配了HTTP请求,因此能正常加载。
解决方案
方案1:允许应用明文HTTP流量(快速解决)
在AndroidManifest.xml的<application>标签中添加属性,全局允许明文请求:
<application ... android:usesCleartextTraffic="true"> ... </application>
若需更安全的配置(仅允许指定域名的HTTP请求),创建res/xml/network_security_config.xml文件:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- 替换为你的HTTP图片域名 --> <domain includeSubdomains="true">your-http-image-domain.com</domain> </domain-config> </network-security-config>
再在AndroidManifest.xml的<application>标签中引用该配置:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
方案2:替换Slider图片加载器为Glide/Picasso(推荐,更灵活)
daimajia的Slider支持自定义图片加载器,直接复用已验证可用的Glide/Picasso加载逻辑:
自定义Glide图片加载器
创建实现BaseSliderView.ImageLoadListener的类:
class GlideImageLoader : BaseSliderView.ImageLoadListener { override fun onLoadImage(slider: BaseSliderView, url: String, callback: BaseSliderView.ImageLoadListener.ImageLoadingCallback) { Glide.with(slider.context) .load(url) .placeholder(slider.emptyDrawable) .error(slider.emptyDrawable) .into(object : CustomTarget<Drawable>() { override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) { callback.onImageReady(resource) } override fun onLoadCleared(placeholder: Drawable?) {} }) } override fun onStartLoading() {} override fun onEndLoading() {} }
在你的滑块初始化代码中设置该加载器:
// 给普通slide设置加载器 val slide = TextSliderView(this).image(imageRes) .setScaleType(BaseSliderView.ScaleType.CenterInside) .empty(R.drawable.no_image_placeholder) .setImageLoader(GlideImageLoader()) // 添加这行 image_slider.addSlider(slide) // 给弹窗滑块也设置加载器 val scaledSlide = DialogTouchImageSlider(this, R.drawable.no_image_placeholder) .description("Description") .image(imageRes) .setScaleType(BaseSliderView.ScaleType.CenterInside) .empty(R.drawable.no_image_placeholder) .setImageLoader(GlideImageLoader()) // 添加这行 dialogSlider.addSlider(scaledSlide)
验证
修改后重新运行应用,HTTP协议的图片即可正常加载,与Glide/Picasso的表现一致。
内容的提问来源于stack exchange,提问作者Shubham Gupta
相关产品推荐
相关产品推荐

