0

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 のものと同じですが、値が異なります。

4

1 に答える 1

1

onMeasure() を不適切にオーバーライドしていたようです。ビューに事前定義された測定値がある場合、私が取ったルートは便利です (250 x 150 ピクセルになることがわかっています)。ただし、ビューを任意の画面サイズに合わせてスケーリングし、レイアウトによって完全に制御したかったので、デフォルトの onMeasure() 実装を使用するだけで済みました。

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

これにより、layout_weight 属性が子ビューのすべてのサイズ変更を処理できるようになります。

于 2012-04-15T03:11:55.933 に答える