9

我读过的所有内容都说你不能在构造函数中调用or getWidth(),但我在. 屏幕的布局不应该已经画好了吗?getHeight()ViewonResume()

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

    populateData();
}

private void populateData() {
    LinearLayout test = (LinearLayout) findViewById(R.id.myview);
    double widthpx = test.getWidth();
}
4

3 回答 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 获取宽度返回 0

于 2014-04-09T19:25:12.353 回答
5

您必须等待至少之前测量当前视图的层次结构getWidthgetHeigth返回一些东西!= 0。您可以做的是检索“根”布局并发布可运行文件。在可运行文件中,您应该能够成功检索宽度和高度

root.post(new Runnable() {
     public void run() {
         LinearLayout test = (LinearLayout) findViewById(R.id.myview);
         double widthpx = test.getWidth();
     }
});
于 2014-04-09T19:26:43.360 回答
0

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

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

此扩展函数确保一旦布局了 VIew,就会执行提供的操作,或者,如果它已经布局,它将立即被调用。

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

本文详细解释了如何测量、放置和绘制 View,以及作为开发人员可以做些什么来确保获得正确的 View 大小。它还介绍了通常推荐的解决方案,例如View.post()和注册OnGlobalLayoutListener,并解释了使用它们时可能出现的问题。

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

于 2022-03-03T13:28:35.653 回答