我有一个应用程序,在屏幕的底部有一个工具栏,其余的充满了自定义视图(请参阅下面的xml).现在,当我将应用程序全屏显示时(我尝试了所有可能性,以编程方式并通过Manifest.xml),当它启动时,整个布局似乎向下移动了大约通知栏的高度.工具栏中的按钮仅在中途可见.有时候,所有这些都会在几秒钟之后或者当我单击工具栏中的按钮时向上移动.
我很确定,这是我的自定义视图的问题,因为如果我用Button等替换它,我就不会得到这个效果.我想它必须与onMeasure方法有关.我真的不知道如何实现它,我的版本如下所示.自定义视图用于绘制内部,因此基本上它希望尽可能大.
任何帮助将非常感激.我已经搜索了几个小时,但还没有任何线索.
layout.xml
这是我的onMeasure方法:
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width,height);
}
MeasureSpec
的模式可以是MeasureSpec.EXACTLY,MeasureSpec.AT_MOST或MeasureSpec.UNSPECIFIED之一.只需接受尺寸组件并将您的测量尺寸设置为完全合适,但对其他组件来说通常不是正确的选择.
因为您在此自定义视图上尝试使用layout_weight以及wrap_content的高度,所以会发生以下情况:
您的自定义视图是LinearLayout的第一个子级,其高度为wrap_content,因此LinearLayout会对其进行测量.由于LayoutParams已告知LinearLayout它应该是wrap_content,因此它使用OFSM的MeasureSpec模式和整个可用空间的大小来测量您的自定义视图.
但是你的自定义视图很贪婪.它决定占用所有可用空间.实质上,您已实现测量以将wrap_content视为match_parent.
现在没有剩下的空间了.下方的按钮栏会相应地进行测量但是还没有完成,有一个孩子有重量.在LinearLayout中,在完成所有正常测量之后剩余的任何空间根据其权重值在加权子节点之间划分.这不是您想要的行为.
当您使用权重来填充可用的垂直空间时,就像在此布局中一样,通常需要将layout_height设置为0dip.这将使LinearLayout跳过该子项的第一个度量传递,并仅使用加权测量传递来测量您的视图,并为其提供剩余的可用空间.