2009-12-24 14 views
6

Ich bin sicher, dass ich etwas Einfaches bin fehle ...android: einfaches Linearlayout und fill_parent Frage

Hintergrund:

Ich bin neu in Android und UI-Design, und ich wollte nur um spielen mit Layouts. Jetzt möchte ich eine Checkbox über dem Text-Label stapeln. Ich bin mit dem folgenden XML-Layout, das funktioniert:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <CheckBox android:id="@+id/check_box" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/check_box_text" /> 

    <TextView android:id="@+id/dummy_display" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/dummy_label" /> 

</LinearLayout> 

Meine Tests (nur ein Gefühl dafür zu bekommen, wie es funktioniert):

  • Szenario 1) Wenn ich das Set CheckBoxlayout_height bis "fill_parent", die CheckBox nimmt den gesamten Bildschirm und ist ausgerichtet Mitte (dh - die TextView verschwindet).

  • Szenario 2) Wenn ich statt die TextViewlayout_height zu "fill_parent" s eingestellt, die CheckBox tut NICHT verschwinden. In der Tat, nichts verschwindet, und das Layout sieht genauso aus wie das obige XML, wo alles nach oben links geschoben wird.

Die Frage (und Kommentare):

Wie kommt Szenario 1 funktioniert so, wie es funktioniert?

Dieses Verhalten scheint mir inkonsistent. Ich dachte, dass fill_parent soll nur das Element füllen lassen, was auch immer Platz im Elternteil verfügbar ist. Also für mich scheint es, dass die TextView erhalten sollte, was auch immer es braucht (da es wrap_content ist), aber die CheckBox sollte den Rest des Raumes aufnehmen (so würde die TextView würde auf den unteren Rand des Bildschirms gezwungen werden, aber nicht unsichtbar). Mit anderen Worten: Szenario 2 ergibt für mich Sinn, Szenario 1 aber nicht.

Bitte erläutern :-).

Danke,

Tom

+0

Vielleicht möchten Sie dies lesen (wenn nicht schon): Wie Android Ansichten zieht? Link: http://developer.android.com/guide/topics/ui/how-android-draws.html – Samuh

Antwort

13

LinearLayout Maßnahmen sie Kinder als einzigen Schritt eins nach dem anderen, so in Ihrem ersten Beispiel sieht es das erste Kind alle verfügbaren Höhe haben wollen sie es sie gibt. In Ihrem zweiten Beispiel gibt es alle verfügbaren Platz für das zweite Kind. Wenn Sie Checkbox all den Platz, außer Platz für Text-Box benötigt nehmen möchten, sollten Sie layout_height von Checkbox wrap_parent und layout_weight Eigenschaft jedes Kind, das Layout Gewicht angibt, gesetzt ändern, wie viel der verfügbaren Platz nach alle Kinder gemessen wurden sollten fügen Sie zu jedem von ihnen hinzu. Um genauer zu sein, die Art und Weise, wie es funktioniert durch Schritte:
1) Parent von LinearLayout erzählt lineares Layout, wie groß es sein kann
2) LinearLayout fragt alle es Kinder in der Reihenfolge, die sie über ihre Layoutparameter angegeben und den verfügbaren Speicherplatz verteilt.
3) Falls ein freier Speicherplatz noch verfügbar ist es zwischen den Kindern verteilt nach ihrem Gewicht des (Layout Gewicht liegt zwischen 0 und 1, 0 - Standardeinstellung)
Hoffe, es hilft
Edit:
Ich habe überprüft LinearLayout Quellcode und herausgefunden, was, wenn ein lineares Layout hatte eine FILL_PARENT Layout Parameter und nicht Null Gewicht Messcode wird Layout Höhe auf WRAP_CONTENT und später verteilen Raum zwischen allen Kindern nach Gewicht.

+0

Hmmm, das scheint nicht ganz korrekt zu sein, aber Sie scheinen nah dran. Wenn ich das Gewicht der Checkbox auf 1 setze ... aber BEHALTE es als fill_parent für die Höhe ... funktioniert es wie erwartet. Das bedeutet, dass der Renderer dem Kontrollkästchen nicht nur den gesamten Platz zur Verfügung stellt, nachdem er fill_parent für die Höhe angezeigt hat. Alles, was du über die Gewichte sagst, ergibt für mich Sinn ... aber ich sehe nicht, wann/wo "fill_parent" in diesen Layoutalgorithmus passt. Machst du? – Tom

+0

siehe meine Bearbeitung für weitere Informationen. Deshalb mag ich es so, immer eine Chance zu haben, etwas zu lernen :) –

+0

Wenn ich dir mehr als eine Stimme geben könnte, würde ich es tun. Es trieb mich NUTS, die versuchen herauszufinden, wie man den verfügbaren Platz mit Ansichten füllen kann, mit mehr Platz für einen anderen. Ich benutzte ein Sammelsurium von relativen Layouts und nicht sehr weit. – I82Much