2013-08-18 9 views
6

Ich kann mir vorstellen, dass dies eine ziemlich einfache Antwort sein sollte, wenn Sie XML-Layouts besser verstehen, als ich das tue. Ich glaube nicht zu bekommen, was ich dachte, wenn ich die match_parent layout_height verwenden sollte.match_parent nicht wie erwartet

Ich habe ein Linearlayout Wurzelelement mit android: orientation = "vertikal". Innerhalb dieser Linearlayout Ich möchte drei Elemente: - Textview - Listview - Textview

sowohl für die Textviews I android gesetzt: layout_height = „wrap_content“ so, dass sie nur so groß sein wird, wie es notwendig ist, ihre anzuzeigen Inhalt. Die Sache ist, ich möchte, dass die eine TextView an der Spitze des Formulars sitzt, die andere am unteren Rand des Formulars sitzen, während die ListView den verfügbaren Platz auf dem Formular füllt. Also hier ist das, was mein xml Layout wie folgt aussieht:

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:text="Top TextView" /> 

<ListView 
    android:id="@+id/listView_Species" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:text="Bottom TextView" /> 

Aber es funktioniert nicht. Hier ist, was ich bekomme. Ich habe die ListView ausgewählt, so dass sie hervorgehoben wird. Beachten Sie, wie es sich bis zum Ende des Formulars erstreckt, indem Sie das untere TextView vom Formular entfernen.

Wenn ich die layout_height -Eigenschaft der ListView auf einen festen Wert wie 180dp ändern, sieht das Formular so aus. Ich poste das nur, um zu beweisen, dass der untere TextView da ist, aber ich weiß immer noch nicht, wie man ihn am unteren Bildschirmrand befestigt, während der ListView den verbleibenden Platz einnimmt, aber zwischen den beiden TextViews.

XML Layout 2

Vielen Dank im Voraus.

Antwort

7

Während die anderen Antworten versuchen, Ihr Problem zu beheben (die sie eigentlich gar nicht - sie vorschlagen, dass Sie etwas tun das sieht ähnlich aber kann oder kann nicht auf verschiedenen Geräten gut aussehen), hat niemand die Lücken in Ihrem Wissen von LinearLayouts und match_parent gefüllt. Und diese Lücken sind sehr häufig - die Dokumentation von Google ist immer noch weit unter dem Stern.

Erstens, wie funktionieren Ansichten innerhalb eines LinearLayout? Lassen Sie uns den Prozess des Zeichnens eines LinearLayouts mit orientation="vertical" der Einfachheit halber durchgehen.

  1. Untersuchen Sie die Höhe des ersten Kind des LinearLayout (LL kurz). Wenn die Höhe oder fill_parent (alter Name für die gleiche Sache) ist, wird die Höhe der Ansicht gestreckt, um den gesamten Anzeigebereich zu füllen. Wenn die Höhe wrap_content ist, messen Sie den vertikalen Abstand, den die Ansicht einnimmt, und verwenden Sie diesen Platz für die Ansicht. Wenn es sich bei der Höhe um eine Zahl ungleich Null handelt, verwenden Sie genau so viele Pixel für die Höhe der Ansicht (möglicherweise zu klein). Wenn die Höhe 0 ist, siehe unten.
  2. Setzen Sie die nächste Ansicht unter die Ansicht in 1. Überprüfen Sie ihre Höhe und entsprechend handeln.
  3. Weiter für alle Ansichten. Wenn eine Ansicht von unten verschoben wird, gehen Sie weiter und beenden Sie die Berechnung, da niemand oder eine nachfolgende Ansicht angezeigt wird (vorausgesetzt, es wird kein ScrollView verwendet).
  4. Wenn die Höhe einer Ansicht 0 ist, überprüfen Sie sie gravity. Dies erfordert einen zweiten Durchlauf, bei dem die Schwerkraft aller Ansichten gespeichert und ihre Höhen proportional zugewiesen werden. Wie Sie sich denken können, verdoppelt der zweite Durchlauf das Zeitlayout, was für einfache Layouts nicht von Bedeutung ist.

Erläuterung Ihres Beispiel: Das erste Kind der LL (die erste Textview) gemessen und nimmt eine bestimmte Menge an Pixeln. Dann nimmt Ihr ListView den gesamten verbleibenden Platz ein (über match_parent). Und dann wird Ihr zweites TextView überhaupt nicht gezeichnet, da es sich am unteren Bildschirmrand befindet. Was genau du beobachtet hast, aber jetzt verstehst du warum.

Lösung: Verwenden Sie RelativeLayout. Funktioniert perfekt in diesem Fall.

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/top_tv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:textSize="30sp" 
     android:text="Top TextView" /> 

    <TextView 
     android:id="@+id/bottom_tv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:textSize="30sp" 
     android:text="Bottom TextView" /> 

    <ListView 
     android:id="@+id/listView_Species" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/top_tv" 
     android:layout_above="@id/bottom_tv" 
     /> 
</RelativeLayout> 

Die RelativeLayout teilt das Layout inflater die erste Textview an der Spitze zu ziehen, dann die zweite Textview am Boden ziehen und dann den Rest des Raumes mit dem Listview zu füllen. Ich glaube, das ist genau das, was du willst.

Willkommen bei Android. Sie werden dieses Muster viel nutzen!

3

Verwenden Sie android: layout_weight, um Gewichte für Ihre Widgets innerhalb des äußersten Layouts zu definieren. Deklarieren Sie ihre Höhe als 0dp und definieren Sie dann android:layout_weight zu jedem von ihnen. Summe Summe der drei von ihnen sollte 1 sein. Je nach Bedarf können Sie 0.1 Gewicht zu oberen und unteren TextView's und definieren 0.8 zu ListView.

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight = "0.1" 
    android:textSize="30sp" 
    android:text="Top TextView" /> 

<ListView 
    android:id="@+id/listView_Species" 
    android:layout_width="match_parent" 
    android:layout_weight = "0.8" 
    android:layout_height="0dp" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:textSize="30sp" 
    android:layout_weight = "0.1" 
    android:text="Bottom TextView" /> 
+0

Ich bin upvoting Ihre Antwort, aber es gibt mir nicht genau das, was ich wollte. Dadurch werden die TextViews auch auf einen bestimmten Prozentsatz der Bildschirmgröße gedehnt. Ich möchte, dass diese behoben werden, während sich nur der ListView ausdehnt, um den verbleibenden Platz einzunehmen. Royi oben, veröffentlichte die Lösung dafür. –

11

Ändern der ListView Höhe 0DP und fügen weight=1
dh:

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:text="Top TextView" /> 

<ListView 
    android:id="@+id/listView_Species" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:text="Bottom TextView" /> 
+0

So viel zu einer Erklärung. Seufzer. –