zhpanvip / BannerViewPager

🚀 An awesome banner view for Android,Based on ViewPager2. 这可能是全网最好用的ViewPager轮播图。简单、高效,一行代码实现循环轮播,一屏三页任意变,指示器样式任你挑。
Apache License 2.0
3.54k stars 434 forks source link

动态设置指示器可见性没有生效 #330

Open felicity520 opened 6 months ago

felicity520 commented 6 months ago

需求:指示器要先隐藏,然后根据左滑右滑让指示器显示 代码: 1、 binding.viewpagerImage.setAdapter(imageListAdapter).setAutoPlay(false).setCanLoop(true) .setIndicatorSlideMode(IndicatorSlideMode.NORMAL).setIndicatorVisibility(View.VISIBLE) .setIndicatorGravity(IndicatorGravity.END).setInterval(4000).setScrollDuration(300) .setIndicatorView(FigureIndicatorView(parent.context).apply { setRadius(DimenUtils.dpi2pxi(18)) setTextSize(DimenUtils.dpi2pxi(12)) setTextColor(Color.WHITE) setBackgroundColor(Color.parseColor("#80000000")) }).create() 2、 binding.viewpagerImage.setIndicatorVisibility(View.GONE) 测试: 发现指示器仍然可见,并没有隐藏 解决: 和作者沟通,可先暂时用反射来控制隐藏显示,以下是可用的代码 kotlin.runCatching { Timber.d("showImageIndicator:${show}") val bannerClazz: Class<*> = Class.forName("com.zhpan.bannerview.BannerViewPager") val indicatorLayoutField = bannerClazz.getDeclaredField("mIndicatorLayout") indicatorLayoutField.isAccessible = true val mIndicatorLayout = indicatorLayoutField.get(binding.viewpagerImage) as RelativeLayout val setVisibilityValue = if (show) View.VISIBLE else View.GONE if (mIndicatorLayout.visibility == setVisibilityValue){ return } val viewClazz: Class<*> = mIndicatorLayout.javaClass val setVisibilityMethod: Method = viewClazz.getMethod("setVisibility", Int::class.javaPrimitiveType) setVisibilityMethod.invoke(mIndicatorLayout, setVisibilityValue) }.onFailure { Timber.d("set Indicator setVisibility failed") }