getMeasuredHeight获取控件高度为0

获取控件高度的时候我们用到getMeasuredHeigh()t和getHeight(),他们两个的区别就是getHeight获取的是屏幕内的高度,而getMeasuredHeigh()获取到的是控件实际的高度,即使是在屏幕外边。

 

在开发项目的时候遇到了一个情况是使用PopupWindow做了一个弹窗,弹窗的底部和根视图中某一个控件的顶部对齐。

 

用到了showAsDropDown(View anchor, int xoff, int yoff)或者showAtLocation(View parent, int gravity, int x, int y);

计算偏移的时候用到了自身的长度,我使用getMeasuredHeigh()调试时获取到的值总是0,后来经过一些调试和查询后,明白了在我的需要展示的view还没有画出来的时候是无法获取到它的宽高的,即便是写死的固定值也不可以。

于是:

final View contentView = LayoutInflater.from(this).inflate(R.layout.picture_quality_option, null);
if (pictureQualityWindow == null) {

	pictureQualityWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
	pictureQualityWindow.setOutsideTouchable(false);
	pictureQualityWindow.setTouchable(true);
}

pictureQualityWindow.showAtLocation(bottomView, Gravity.NO_GRAVITY, 0, 0);
contentView.post(new Runnable() {
	@Override
	public void run() {
		int height = contentView.getMeasuredHeight();
		pictureQualityWindow.dismiss();
		pictureQualityWindow.showAsDropDown(bottomView, 0, -(bottomView.getHeight() + height));
	}
});

思路是先将他展示在屏幕外,然后再计算并记录他的高度,最后再把它展示屏幕内的位置。

 

 

解决办法2:

去查看要展示的PopupWindow的高度,然后把dp根据屏幕密度计算转换成像素单位的高度,使用这个值作为空间的偏移量。但是这种方法不够灵活,当控件改变的时候,还要去再去查看新的控件的高度,重新计算。

 

附dp和px相互转换的代码:

/**
     * 将dp转换成px
     *
     * @param context
     * @param dpValue
     * @return
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 将像素转换成dp
     *
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值