我设计了一个布局,其中 LinearLayout
有2个孩子 LinearLayout
和 FrameLayout
,在每个孩子中我都放了不同的视图 .
我只是想测量 FrameLayout
的高度和宽度,以便我可以达到我的目的 .
在我正在使用的程序中
int height,width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getHeight();
width=fr.getWidth();
两者都返回 0
的值
即使我尝试使用以下代码int height,width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getMeasuredHeight();
width=fr.getMeasuredWidth();
返回相同的值 0
最后我尝试使用以下代码,int height,width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getgetLayoutParams().height();
width=fr.getLayoutParams().width;
给我 -2
和 -1
我希望解决方案以编程方式获取任何布局的高度和宽度?
12 回答
视图本身,它有自己的生命周期,基本如下:
附上
测量
布局
画画
因此,根据您何时尝试获得宽度/高度,您可能看不到您期望看到的内容,例如,如果您在onCreate期间执行此操作,则另一方面,视图可能甚至无法在此时间进行测量如果你在按钮的onClick方法中这样做,很可能到目前为止该视图已被附加,测量,布局和绘制,因此,您将看到预期值,您应该实现ViewTreeObserver以确保您获得适当时刻的 Value 观 .
我认为你在OnCreate()方法中获得了高度和宽度,这就是为什么你总是得到0值,因为那时你的视图仍然没有创建 .
尝试通过单击按钮获得高度和宽度,否则..
作为CapDroid,您正在尝试在视图之前获取大小(如果已绘制),另一种可能的解决方案可能是在视图上执行具有runnable的Post:
如果得到-1或-2,它也可以是LayoutParams.WRAP_CONTENT(-2)或LayoutParams.MATCH_PARENT(-1)的数值 .
只要给你的身高,如果需要,你将获得身高甚至宽度 .
/ ** 在视图渲染之前获取视图高度 @param查看要测量的视图* @return视图的高度* /
试试这个方法:
要么
第一个片段是正确的,但你需要调用它来执行 after
onMeasure()
. 否则,尚未测量视图的大小 .对于框架:
对于屏幕:
最简单的方法是使用ViewTreeObserver,如果直接使用.height或.width,则值为0,因为视图在我们的屏幕上绘制之前没有大小 . 以下示例将说明如何使用ViewTreeObserver
如果你需要在方法上使用它,请像这样使用并保存值,你可以使用全局变量 .
我有同样的问题,但不想在测量之前画在屏幕上,所以我在尝试获得高度和宽度之前使用这种测量视图的方法 .
使用示例:
尝试从this链接这样的代码
希望这可以帮助 .
我使用DisplayMetrics来获取屏幕大小,然后我可以将宽度/高度分配给%age中的元素
它会是这样的
为我工作得很好!!!