为什么在 onResume() 中调用 View 的 getWidth() 返回 0?

问题描述 投票:0回答:3

我读过的所有内容都说你不能在构造函数中的

getWidth()
上调用
getHeight()
View
,但我在
onResume()
中调用它们。到时候屏幕的布局不是应该已经画好了吗?

@Override
protected void onResume() {
    super.onResume();

    populateData();
}

private void populateData() {
    LinearLayout test = (LinearLayout) findViewById(R.id.myview);
    double widthpx = test.getWidth();
}
java android android-layout activity-lifecycle
3个回答
5
投票

调用

onResume()
时,视图尚未绘制,因此其宽度和高度均为 0。您可以使用
OnGlobalLayoutListener()
“捕捉”其大小变化:

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {

        // Removing layout listener to avoid multiple calls
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            yourView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
        else {
            yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }

        populateData();
    }
});

有关其他信息,请查看 Android get width returns 0


5
投票

您必须等待至少在

getWidth
getHeigth
返回某些内容 != 0 之前测量当前视图的层次结构。您可以做的是检索“根”布局并发布可运行的。在可运行的内部,您应该能够成功检索宽度和高度

root.post(new Runnable() {
     public void run() {
         LinearLayout test = (LinearLayout) findViewById(R.id.myview);
         double widthpx = test.getWidth();
     }
});

1
投票

正如之前的回答所述 - 您的观点尚未得到衡量。看看 Android KTX - Jetpack 下的 Kotlin 扩展,尤其是这个:

View.doOnLayout((view: View) -> Unit)?)

此扩展函数可确保在布局视图后执行所提供的操作,或者如果已经布局,则将立即调用该操作。

https://developer.android.com/reference/kotlin/androidx/core/view/package-summary#(android.view.View).doOnLayout(kotlin.Function1)

本文详细解释了如何测量、放置和绘制视图,以及作为开发人员可以采取哪些措施来确保获得正确的视图尺寸。它还介绍了通常推荐的解决方案,例如

View.post()
和注册
OnGlobalLayoutListener
,并解释了使用它们时可能出现的问题。

https://cheesecakelabs.com/blog/understanding-android-views-dimensions-set/

© www.soinside.com 2019 - 2024. All rights reserved.