Android 使用嵌套线性布局时,布局权重未按预期工作
我希望获得线性布局以按所需比例显示视图。我已经仔细阅读了10到15个关于线性布局和布局重量的其他问题,但由于某些原因,似乎没有任何答案适用于我的情况。我正在使用自定义视图创建自定义AlertDialog颜色选择器,创建方式如下:Android 使用嵌套线性布局时,布局权重未按预期工作,android,android-layout,android-linearlayout,android-layout-weight,Android,Android Layout,Android Linearlayout,Android Layout Weight,我希望获得线性布局以按所需比例显示视图。我已经仔细阅读了10到15个关于线性布局和布局重量的其他问题,但由于某些原因,似乎没有任何答案适用于我的情况。我正在使用自定义视图创建自定义AlertDialog颜色选择器,创建方式如下: private LinearLayout createLayout() { //Create our top-level layout LinearLayout mainLayout = new LinearLayout(mContext); m
private LinearLayout createLayout() {
//Create our top-level layout
LinearLayout mainLayout = new LinearLayout(mContext);
mainLayout.setOrientation(LinearLayout.VERTICAL);
mainLayout.setPadding(15, 0, 15, 0);
//Make the preset view at the top
LinearLayout.LayoutParams presetViewParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.2f);
mainLayout.addView(new PresetView(mContext), presetViewParams);
//Create another linear layout
LinearLayout subLayout = new LinearLayout(mContext);
subLayout.setOrientation(LinearLayout.HORIZONTAL);
subLayout.setPadding(0, 15, 0, 15);
//Add the Sat Lum View to the second layout
LinearLayout.LayoutParams satLumViewParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.60f);
subLayout.addView(new SatLumView(mContext), satLumViewParams);
//Add the divider between the sat lum view and the hue view
LinearLayout.LayoutParams dividerViewParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.1f);
subLayout.addView(new DividerView(mContext), dividerViewParams);
//Add the Hue View to the second layout
LinearLayout.LayoutParams hueViewParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.30f);
subLayout.addView(new HueView(mContext), hueViewParams);
//Add the second layout to the first layout
LinearLayout.LayoutParams subLayoutParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.7f);
mainLayout.addView(subLayout, subLayoutParams);
//Add the Line view at the bottom of the main layout
LinearLayout.LayoutParams lineParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.1f);
mainLayout.addView(new LineView(mContext), lineParams);
//Return our completed layout
return mainLayout;
}
我遇到的问题是,尽管已将我的三个垂直元素(预设视图、子布局和线视图)的布局高度设置为0
,但权重仍然无法按我所需的方式分配可用空间。子布局不会获得70%的空间,但总是更少
据我所知,PresetView总是获得它所要求的尽可能多的垂直空间,而subLayout和LineView则保留了剩余空间。以下是我的预设视图的onMeasure()
方法:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = resolveSize(250, widthMeasureSpec);
int height = resolveSize(150, heightMeasureSpec);
setMeasuredDimension(width, height);
}
250和150是相当任意的值-PresetView设计用于几乎任何尺寸集(因为我希望LinearLayout控制其大小!)
我的印象是,使用布局高度0并指定权重使布局控制视图占用的空间,而不是视图控制它。为什么当我将预设视图的布局高度设置为0时,它仍然占据了整整150个像素
其他视图的
onMeasure()
方法与PresetView的方法相同,只是值不同。看起来我不正确地覆盖了onMeasure()。如果视图具有预定义的测量值(您知道它将是250 x 150像素),则我采用的路线非常有用。但是,由于我希望视图能够缩放以适应任何屏幕大小,并完全由其布局控制,因此我需要做的就是使用默认的onMeasure()实现:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
这允许layout_weight属性处理子视图的所有大小调整