LinearLayout を取得して、目的の比率でビューを表示したいと考えています。LinearLayout と layout_weight に関する他の 10 または 15 の質問を熟読しましたが、何らかの理由で、私の場合には答えがないようです。次のように作成されたカスタム ビューを使用して、カスタム AlertDialog カラー ピッカーを作成しています。
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;
}
私が抱えている問題は、3 つの垂直要素 (PresetView、subLayout、および LineView) の layout_height を に設定したにもかかわらず0
、ウェイトが使用可能なスペースを希望どおりに分配していないことです。subLayout はスペースの 70% を取得しませんが、常にそれより少なくなります。
私が知る限り、PresetView は常に必要なだけの垂直方向のスペースを取得しており、subLayout と LineView は残りを占有するために残されています。onMeasure()
PresetViewの私の方法は次のとおりです。
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 の layout_height を使用し、重みを指定すると、ビューがそれを制御するのではなく、ビューが占めるスペースをレイアウトが制御するという印象を受けました。layout_height を 0 に設定すると、PresetView がまだ 150 ピクセルを占有しているのはなぜですか?
他のビューのonMeasure()
メソッドは PresetView のものと同じですが、値が異なります。