Android垂直LinearLayout中weight导致子布局宽度为0的原因
问题原因与解决方案
核心原因:LinearLayout的Weight作用方向和布局方向绑定
LinearLayout的weight属性仅会在当前布局的主轴方向分配剩余空间:
- 当布局为水平方向时,主轴是水平(宽度方向),
weight会控制子View的宽度分配,此时把宽度设为0,weight会生效,子View能获得对应比例的宽度。 - 当布局为垂直方向时,主轴是垂直(高度方向),
weight只会控制子View的高度分配,不会影响宽度。你给子布局设置了width=0,但垂直布局下weight不会处理宽度,所以子布局宽度真的是0,自然无法显示。
解决方案
根据你的需求(子布局在垂直主布局中显示,按比例分配空间),需要修正子布局的LayoutParams:
你想要的是子布局宽度占满父布局,高度按weight比例分配,所以应该把高度设为0,宽度设为MatchParent,同时设置weight值:
// 替换子布局Ore类中的LayoutParams代码 LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, 0, 0.8F);
这样在垂直主布局中,weight会在高度方向分配剩余空间,宽度则占满父布局,子布局就能正常显示了。
额外说明
如果你的需求是子布局高度占满父布局(MatchParent),宽度不需要weight分配,那直接设置宽度为MatchParent,高度为MatchParent即可,不需要设置width=0和weight:
LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent);
内容的提问来源于stack exchange,提问作者ODINN
相关产品推荐
相关产品推荐

