getHeight()未返回正确的值-首次运行时使用ViewTreeObserver-

时间:2019-08-17 15:41:30

标签: android

MainActivity中,单击相机按钮,拍照,然后图像显示在PreviewActivity上,然后我应该得到imageView的宽度和高度。 / p>

当我触摸屏幕时,我试图显示一条log消息,其中显示了高度值;现在,高度值已得到校正;所以我认为问题在于,imageView可能一开始并没有被布局。即使我使用的是 {getViewTreeObserver() 。“

    ViewTreeObserver viewTreeObserver = mImageView.getViewTreeObserver();
    if (viewTreeObserver.isAlive()) {
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mImageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                setImage(mCurrentPhotoPath, selectedImageUri);
            }
        });
    }

编辑:弄清了问题是高度值比实际值高。因为当打开相机应用时, statusBar 被隐藏了,并且再次显示在PreviewActivity上,但是imageView是在再次备份 statusBar 之前测量的,这会导致问题并导致Height变高。

2 个答案:

答案 0 :(得分:2)

您可以尝试在post方法中获取宽度,例如:

mImageView.post(new Runnable(){

    @Override
    public void run() {
        mHeight = mImageView.getHeight(); //height is ready
    }
});

据我所知,帖子中的可运行任务将在视图的尺寸和布局之后执行。

答案 1 :(得分:1)

因此,我能够解决此问题的唯一方法是;如果我们从相机获取了图像(并且从MainActivity打开了图像),则在稍加延迟后获得高度和宽度,以便所有内容都可以布置好。

//--             Get image path from previous activity
        mCurrentPhotoPath = getIntent().getStringExtra("imagePath");
        selectedImageUri = getIntent().getData();

        helper.setImage(mCurrentPhotoPath, selectedImageUri); //set image to imageView


        if (cameraOpenedFromMainActivity) {
            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {
                    //method to get height and width and do stuff
                }
            }, 500); //increase until everything is fine

        }else {
            ViewTreeObserver viewTreeObserver = mImageView.getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        mImageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                        //method to get height and width and do stuff
                    }
                });
            }
        }
        //--