使用Glide加载图片后BottomSheet消失的问题及解决咨询
解决Glide加载图片导致BottomSheet消失的问题
嘿,我之前也踩过这个坑!核心原因是Glide加载完图片后,ImageView的尺寸发生了变化,触发了requestLayout(),而BottomSheet的Behavior会因为布局重绘重新计算自身状态,最终导致意外收起甚至消失。下面给你几个按优先级排序的可行方案:
1. 固定ImageView尺寸(最推荐)
直接在bottom_sheet_item.xml里给ImageView设置固定宽高,或者用约束布局锁死它的尺寸,这样图片加载后只会缩放适配ImageView,不会改变容器大小,自然就不会触发布局重排。
比如修改你的ImageView标签:
<ImageView android:id="@+id/bottom_sheet_image" android:layout_width="150dp" android:layout_height="150dp" android:scaleType="centerCrop" <!-- 确保图片适配View,不撑大容器 --> app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"/>
2. 让Glide强制加载指定尺寸的图片
如果不想固定ImageView的布局尺寸,可以在Glide加载时用override()方法指定图片的目标尺寸,让Glide提前把图片缩放到对应大小,避免加载后ImageView因图片尺寸变化重排:
Glide.with(this) .load(yourImageUrl) .override(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) // 也可以指定具体数值,比如override(200,200) .into(bottomSheetImageView);
3. 延迟加载,等BottomSheet稳定后再加载
如果必须让ImageView自适应尺寸,可以监听BottomSheet的状态,等它完全展开并稳定后再执行图片加载:
BottomSheetBehavior<ConstraintLayout> bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetView); bottomSheetBehavior.addOnStateChangedListener(new BottomSheetBehavior.OnStateChangedListener() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_EXPANDED) { // 此时BottomSheet已完全展开,安全加载图片 Glide.with(MainActivity.this) .load(yourImageUrl) .into(bottomSheetImageView); // 只需要加载一次的话,这里可以移除监听 bottomSheetBehavior.removeOnStateChangedListener(this); } } });
4. 禁止ImageView触发requestLayout(谨慎使用)
极端情况下可以强制让ImageView不触发requestLayout(),但这可能导致图片显示异常等问题,仅作为最后备选:
bottomSheetImageView.setWillNotRequestLayout(true);
建议先尝试第一种方案,它最稳妥且能覆盖大多数场景;如果你的业务需要ImageView自适应,再考虑后面的方法。
内容的提问来源于stack exchange,提问作者Roma Heshten
相关产品推荐
相关产品推荐

