我读过的所有内容都说你不能在构造函数中的
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();
}
调用
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。
您必须等待至少在
getWidth
和 getHeigth
返回某些内容 != 0 之前测量当前视图的层次结构。您可以做的是检索“根”布局并发布可运行的。在可运行的内部,您应该能够成功检索宽度和高度
root.post(new Runnable() {
public void run() {
LinearLayout test = (LinearLayout) findViewById(R.id.myview);
double widthpx = test.getWidth();
}
});
正如之前的回答所述 - 您的观点尚未得到衡量。看看 Android KTX - Jetpack 下的 Kotlin 扩展,尤其是这个:
View.doOnLayout((view: View) -> Unit)?)
此扩展函数可确保在布局视图后执行所提供的操作,或者如果已经布局,则将立即调用该操作。
本文详细解释了如何测量、放置和绘制视图,以及作为开发人员可以采取哪些措施来确保获得正确的视图尺寸。它还介绍了通常推荐的解决方案,例如
View.post()
和注册 OnGlobalLayoutListener
,并解释了使用它们时可能出现的问题。
https://cheesecakelabs.com/blog/understanding-android-views-dimensions-set/