Android Layout mit ListView und Buttons

101

Okay, dieses spezielle Layout nervt mich nur. Und es scheint nicht möglich zu sein, eine Listenansicht mit einer Reihe von Schaltflächen am unteren Rand zu finden, damit die Listenansicht nicht über die Schaltflächen hinausragt und die Schaltflächen immer am unteren Bildschirmrand ausgerichtet sind. Folgendes möchte ich:

Der tote ImageShack-Link wurde entfernt

Es scheint so einfach zu sein, aber alles, was ich versucht habe, ist fehlgeschlagen. Irgendeine Hilfe?

Hier ist mein aktueller Code:

    RelativeLayout container = new RelativeLayout(this);
    container.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));

    //** Add LinearLayout with button(s)

    LinearLayout buttons = new LinearLayout(this);

    RelativeLayout.LayoutParams bottomNavParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    bottomNavParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    bottomNavParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    buttons.setLayoutParams(bottomNavParams);


    ImageButton newLayer = new ImageButton(this);
    newLayer.setImageResource(R.drawable.newlayer);
    newLayer.setLayoutParams(new LinearLayout.LayoutParams(45, LayoutParams.FILL_PARENT));
    buttons.addView(newLayer);

    container.addView(buttons);

    //** Add ListView

    layerview = new ListView(this);

    RelativeLayout.LayoutParams listParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    listParams.addRule(RelativeLayout.ABOVE, buttons.getId());

    layerview.setLayoutParams(listParams);

    container.addView(layerview);
Kleptin
quelle
Gute Frage, viele Entwickler werden daran hängen bleiben.
Signcodeindie
Zum Glück ist der Designer in Android eigentlich ziemlich süß. Versuchen Sie daher beim Erstellen eines Layouts / einer Benutzeroberfläche, Designer / XML zu verwenden. Besonders für dieses Szenario, da es sich lediglich um eine Reihe von Schaltflächen und eine ListView handelt.
Subby

Antworten:

137

Ich denke, das ist es, wonach Sie suchen.

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

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:id="@+id/testbutton"
        android:text="@string/hello" android:layout_alignParentBottom="true" />

    <ListView android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@+id/list"
        android:layout_alignParentTop="true" android:layout_above="@id/testbutton" />

</RelativeLayout>
lars
quelle
Das habe ich im Grunde genommen verwendet, obwohl ich das Layout in Java schreibe. Die listView erstreckt sich weiterhin über die Schaltflächen.
Kleptine
1
Das einzige, was ich ändere, ist, dass ich ein relativeLayout um die ListView hinzufüge, weil ich addRule (RelativeLayout.ABOVE) in einer ListView nicht aufrufen kann.
Kleptine
2
Dieser Code sollte gut funktionieren. android:layout_above="@id/testbutton"wird die ListViewoben genannten behalten Button.
CommonsWare
Wenn ich dies benutze, wird die Liste über der Schaltfläche angehalten und dann intern mit dem Scrollen begonnen.
Lars
7
Sie rufen auch nicht addRule(RelativeLayout.ABOVE)an RelativeLayout. Sie nennen es auf einem RelativeLayout.LayoutParams. Sie fügen dann die ListViewzu dem RelativeLayout, dass Versorgung RelativeLayout.LayoutParams. Bitte denken Sie daran, auf XML umzusteigen und es aufzublasen, um eine langfristige Wartbarkeit zu gewährleisten.
CommonsWare
57

Ich hatte seit Ewigkeiten das gleiche Problem.

Die Lösung, um die ListView über den Schaltflächen zu halten, aber zu verhindern, dass sie bei langer Liste verdeckt wird, besteht darin, android: layout_weight = "1.0" in der ListView festzulegen. Lassen Sie das layout_weight auf den Schaltflächen deaktiviert, damit sie ihre natürliche Größe beibehalten. Andernfalls werden die Schaltflächen skaliert. Dies funktioniert mit LinearLayout.

In Android ApiDemos gibt es ein Beispiel: ApiDemos / res / layout / linear_layout_9.xml

David Ingram
quelle
Sparen Sie mir noch ein paar Stunden. Konnte nicht verstehen, warum die Schaltflächen nie angezeigt wurden. :)
frostymarvelous
Ich verstehe nicht ganz, warum das funktioniert, aber es funktioniert :)
Bevor
20

Ich habe nur nach einer Antwort auf diese Frage gesucht und dies war eines der ersten Ergebnisse. Ich habe das Gefühl, dass alle Antworten, einschließlich derjenigen, die derzeit als "beste Antwort" ausgewählt wird, das angesprochene Problem nicht ansprechen. Das Problem, das angegeben wird, besteht darin, dass es eine Überlappung der beiden Komponenten gibt Buttonund ListViewdass die ListView den gesamten Bildschirm einnimmt und die Schaltfläche visuell über (vor) der ListView schwebt (Blockieren der Ansicht / des Zugriffs der letzten) Artikel in der ListView)

Basierend auf den Antworten, die ich hier und in anderen Foren gesehen habe, bin ich schließlich zu einem Schluss gekommen, wie ich das lösen kann.

Ursprünglich hatte ich:

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

  <ListView
    android:id="@+id/game_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    />

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    style="@android:style/ButtonBar">

    <Button
      android:id="@+id/new_game"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/new_game"
      android:textColor="#FFFFFFFF"
      android:background="@drawable/button_background" />
  </LinearLayout>

</RelativeLayout>

Beachten Sie die Verwendung von RelativeLayoutals Wurzelknoten.

Dies ist die endgültige, funktionierende Version, in der der Button nicht überlappt ListView:

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

  <ListView
    android:id="@+id/game_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_weight="1.0" />

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    style="@android:style/ButtonBar">

    <Button
      android:id="@+id/new_game"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/new_game"
      android:textColor="#FFFFFFFF"
      android:background="@drawable/button_background" />
  </LinearLayout>

</LinearLayout>

Es gibt nur zwei Unterschiede. Zuerst habe ich auf a umgestellt LinearLayout. Dies wird beim nächsten Bit helfen, das android:layout_weightzu meinem hinzugefügt wurdeListView

Ich hoffe das hilft.

Dallas
quelle
Das löst sich, aber wer würde das erraten? Wenn Sie android:layout_alignParentBottominnerhalb eines LinearLayoutübergeordneten Elements angeben, sagt ADT "Ungültiger Layoutparameter in einem LinearLayout: layout_alignParentBottom"!
Aswin Kumar
8

Der beste Weg ist ein relatives Layout, mit dem die Schaltflächen unter der Listenansicht festgelegt werden. In diesem Beispiel sind die Schaltflächen auch linear angeordnet, da es einfacher ist, sie gleich groß nebeneinander zu platzieren.

<RelativeLayout android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent">

<ListView android:id="@+id/ListView01" 
android:layout_alignParentTop="true"
android:layout_width="fill_parent" 
android:layout_height="fill_parent">
</ListView>

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_below="@+id/ListView01" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true">
<Button android:id="@+id/ButtonJoin" 
android:text="Join"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentBottom="true">
</Button>
<Button android:id="@+id/ButtonJoin" 
android:layout_alignRight="@id/ButtonCancel" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel"
android:layout_alignParentBottom="true">
</Button>
</LinearLayout>

</RelativeLayout>
Patrick Kafka
quelle
Das Problem ist, dass es sich über die Schaltflächen unten erstreckt, wenn die Listenansicht jedoch zu lang ist. Ich kann nicht herausfinden, wie ich es dazu bringen kann, über den Knöpfen anzuhalten.
Kleptine
2
Wenn Sie (ich denke 1.5, vielleicht sogar 1.6) verwenden, MÜSSEN Sie die Schaltflächen VOR der ListView haben, wenn Sie RelativeLayout-Regeln verwenden. Andernfalls kennt das Layout die Schaltflächen noch nicht, da es sie in der richtigen Reihenfolge liest, weshalb Ihre ListView erweitert wird an ihnen vorbei.
Tim H
Das funktioniert bei mir nicht. Wie Tim H sagt, muss ich für mich die ListView nach dem LinearLayout setzen und dann die ListView layout_above erstellen, wie in der obigen Antwort von repoc.
Nemi
Dies wird nicht funktionieren, die Schaltfläche ist nicht auf dem Bildschirm und wird nicht
gescrollt
1

Ich weiß, dass dieser Beitrag ziemlich alt ist, aber um die Frage des Originalplakats zu beantworten, war der Grund, warum der Code nicht funktionierte, button.getId () gibt -1 zurück. Wenn Sie dies tun möchten, müssen Sie so etwas wie call button.setId (10) festlegen. Wenn Sie das tun, funktioniert der Code einwandfrei.

Doo Dah
quelle
0

das sollte funktionieren. Um Schaltflächen auch über der Listenansicht zu haben, platzieren Sie die Schaltflächen in einem anderen linearen Layout.

<LinearLayout> main container // vertical

<LinearLayout> scrollview must be contained in a linear layout //vertical - height to fill parent

    <ScrollView> set the height of this to fill parent

        <ListView> will be contained in the scrollview
        </ListView>

    </ScrollView>

</LinearLayout>

<LinearLayout> //horizontal - height to wrap content

<Button>

</Button>

</LinearLayout>

</LinearLayout>
Rhys
quelle
0

Die einfachste Lösung wäre, zwei lineare Layouts zu erstellen, eines mit der Schaltfläche und das andere mit der Listenansicht (Inhalt auf der Schaltflächenhöhe umbrechen und übergeordnetes Element auf der Listenlayouthöhe abgleichen). Erstellen Sie dann nur eine Bildlaufansicht über das Layout mit der Listenansicht, und das Schaltflächenlayout wird ignoriert. Ich hoffe, es hilft, tut mir leid, ich hatte keine Lust, den Code zu schreiben.

Pete
quelle