2012-04-13 3 views
0

LinearLayoutで希望の割合でビューを表示できない場合があります。私はLinearLayoutとlayout_weightについて10〜15の質問を熟読してきましたが、何らかの理由で私の場合は答えが出ないようです。私は次のように作成したカスタムビューとカスタムAlertDialogのカラーピッカーを作成しています:ネストされたLinearLayoutを使用しているとき、Layout_weightが必要なように機能していません。

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は残りの部分を占有しています。ここでPresetViewための私のonMeasure()メソッドは、次のとおりです。

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int width = resolveSize(250, widthMeasureSpec); 
     int height = resolveSize(150, heightMeasureSpec); 
     setMeasuredDimension(width, height); 
    } 

250および150は、むしろ任意の値です - 私はのLinearLayoutは、その大きさを制御したいのでPresetViewは、寸法のちょうど約あらゆるセット(で動作するように設計されています! )。私は、0のlayout_heightを使用してウェイトを指定すると、ビューを制御するのではなく、ビューが占めるスペースを制御してレイアウトを配置するという印象を受けました。 PresetViewはlayout_heightを0に設定しても、なぜ完全な150ピクセルを占めるのですか?

他のビューのonMeasure()メソッドはPresetViewと同じですが、値が異なるだけです。

答えて

1

私はonMeasure()を不適切にオーバーライドしているようです。私が取ったルートは、ビューに予め定義された測定値がある場合(あなたはそれが250 x 150ピクセルになることを知っています)、有用です。これはlayout_weight属性は、することができます

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

:私は私の見解は、任意の画面サイズに合わせてスケーリングするために、そのレイアウトによって完全に制御することが望んでいたので、私が行うために必要なことすべてがデフォルトonMeasure()の実装を使用しました子ビューのすべてのサイズ変更を処理します。

関連する問題