使用DataBinding运行时获取ImageView宽度始终为0的问题求助
解决DataBinding中ImageView获取宽度始终为0的问题
首先得指出你代码里一个非常明显的错误——你在获取宽度的时候,用的是mBinding.tvReviews.getWidth(),但你的目标控件是bannerImage啊!这就导致你要么拿到的是另一个控件的宽度,要么如果tvReviews也没完成布局,就会返回0。这绝对是你当前问题的核心原因之一!
接下来,我们再说说为什么会出现获取宽度为0的情况:View的宽度和高度是在布局测量阶段完成后才会有实际值的,如果在测量完成前调用getWidth(),就会返回0。虽然你用了OnGlobalLayoutListener,但因为对象写错了,所以根本没拿到正确的View的宽度。
修正方案一:修复OnGlobalLayoutListener的代码
先把目标View对象改对,同时优化监听的移除逻辑(兼容不同API版本):
@Override public void onResume() { super.onResume(); mBinding.notifyChange(); final ImageView bannerImage = mBinding.bannerImage; bannerImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // 先移除监听,避免重复触发 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { bannerImage.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { bannerImage.getViewTreeObserver().removeGlobalOnLayoutListener(this); } int actualWidth = bannerImage.getWidth(); Log.e("tag","bannerImage actual width==" + actualWidth); if (actualWidth > 0) { ViewGroup.LayoutParams params = bannerImage.getLayoutParams(); params.height = (int) (actualWidth / 1.75); bannerImage.setLayoutParams(params); Log.e("tag","updated height==" + params.height); mBinding.notifyPropertyChanged(com.webkul.mobikulmp.BR.bannerImage); } } }); }
修正方案二:用更简洁的View.post()方法
View.post()会把Runnable放到UI线程的消息队列中,等待View完成布局测量后再执行,代码更简洁,不需要处理ViewTreeObserver的监听移除:
@Override public void onResume() { super.onResume(); mBinding.notifyChange(); final ImageView bannerImage = mBinding.bannerImage; bannerImage.post(new Runnable() { @Override public void run() { int actualWidth = bannerImage.getWidth(); Log.e("tag","bannerImage actual width==" + actualWidth); if (actualWidth > 0) { ViewGroup.LayoutParams params = bannerImage.getLayoutParams(); params.height = (int) (actualWidth / 1.75); bannerImage.setLayoutParams(params); Log.e("tag","updated height==" + params.height); mBinding.notifyPropertyChanged(com.webkul.mobikulmp.BR.bannerImage); } } }); }
额外排查点
如果还是获取不到宽度,可以检查以下几点:
- 确认
bannerImage的visibility不是GONE(GONE的View不会被测量,宽度始终为0) - 确认父布局的布局参数是正常的,比如父布局不是
wrap_content导致ImageView无法被正确拉伸到match_parent - 如果你是在Fragment中使用,确保是在
onViewCreated之后再执行这些代码,而不是更早的生命周期方法
内容的提问来源于stack exchange,提问作者Anand Suthar
相关产品推荐
相关产品推荐

