2012-04-13 13 views
0

Ich habe Probleme, mit meinem LinearLayout Ansichten im gewünschten Verhältnis anzuzeigen. Ich habe etwa 10 oder 15 weitere Fragen zu LinearLayout und layout_weight gelesen, aber aus irgendeinem Grund scheinen in meinem Fall keine Antworten zu treffen. Ich erstelle einen benutzerdefinierten Alertdialog Farbpicker mit einer benutzerdefinierten Ansicht wie folgt erstellt:Layout_weight funktioniert nicht wie gewünscht, wenn ein verschachteltes LinearLayout verwendet wird

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; 
} 

Das Problem, das ich habe, ist, dass trotz der layout_height meiner drei vertikalen Elemente einzustellen (PresetView, subLayout und Lineview) auf "0" verteilt das Gewicht immer noch nicht den verfügbaren Platz wie ich will. subLayout erhält nicht 70% des Speicherplatzes, aber immer weniger. Von dem, was ich sagen kann, erhält der PresetView immer so viel vertikalen Raum, wie es verlangt, und SubLayout und LineView sind übrig, um den Rest aufzunehmen. Hier ist meine onMeasure() -Methode für PresetView:

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

Die 250 und 150 sind eher willkürliche Werte - die PresetView ist so konzipiert, mit fast jedem Satz von Dimensionen zu arbeiten (weil ich das Linearlayout will seine Größe kontrollieren!). Ich hatte den Eindruck, dass die Verwendung einer layout_height von 0 und die Angabe einer Gewichtung das Layout in die Kontrolle über den von der Ansicht eingenommenen Raum und nicht mehr durch die Steuerung der Ansicht bringen. Warum nimmt PresetView immer noch volle 150 Pixel auf, wenn ich die layout_height auf 0 setze?

Die onMeasure() -Methode der anderen Ansichten ist identisch mit PresetView, nur mit anderen Werten.

Antwort

1

Es sieht so aus, als hätte ich OnMeasure() falsch überschrieben. Die Route, die ich gemacht habe, ist nützlich, wenn die Ansicht vordefinierte Messungen hat (Sie wissen, dass es 250 x 150 Pixel sein wird). Da ich aber meine Ansichten wollte jede Bildschirmgröße skalieren, um fit und vollständig durch ihre Layouts gesteuert werden, alles, was ich tun musste, war die Standard onMeasure() Implementierung verwenden:

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

Dies das layout_weight Attribut erlaubt Behandle alle Größen der untergeordneten Ansichten.