Android: Wie können Sie eine Schaltfläche unten und eine Listenansicht oben ausrichten?

76

Ich möchte eine Schaltfläche am unteren Rand der Listenansicht haben.

Wenn ich relativeLayout / FrameLayout verwende, wird es ausgerichtet, aber listView geht bis zum Ende.

(Hinter dem Knopf unten)

Geben Sie hier die Bildbeschreibung ein

FrameLayout:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true">
        <Button
            android:id="@+id/btnButton"
            android:text="Hello"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" />
    </FrameLayout>
</FrameLayout>

RelativeLayout:

<?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">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">
        <Button
            android:id="@+id/btnButton"
            android:text="Hello"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" />
    </RelativeLayout>
</RelativeLayout>

Die obigen zwei Codes funktionieren nur wie das erste Bild. Was ich will, ist das zweite Bild.

Kann jemand helfen?

Vielen Dank.

jclova
quelle

Antworten:

181

A FrameLayouts Zweck ist es, Dinge übereinander zu legen. Das ist nicht was du willst.

In Ihrem RelativeLayoutBeispiel stellen Sie die ListViewHöhe und Breite von s so ein MATCH_PARENT, dass es den gleichen Platz wie das übergeordnete Element einnimmt und somit den gesamten Platz auf der Seite einnimmt (und die Schaltfläche abdeckt).

Versuchen Sie etwas wie:

<LinearLayout 
   android:layout_width="match_parent" 
   android:layout_height="match_parent" 
   android:orientation="vertical">
  <ListView 
     android:layout_width="match_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1"/>
  <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0"/>
</LinearLayout>

Das bestimmt, layout_weightwie der zusätzliche Platz genutzt werden soll. Der Buttonwill sich nicht über den Platz hinaus erstrecken, den er benötigt, also hat er ein Gewicht von 0. Der ListViewwill den gesamten zusätzlichen Platz einnehmen, also hat er ein Gewicht von 1.

Sie könnten etwas Ähnliches mit a erreichen RelativeLayout, aber wenn es nur diese beiden Punkte sind, dann denke ich, dass a LinearLayouteinfacher ist.

Cheryl Simon
quelle
5
Mein Problem wurde gelöst, android:weightsollte aber sein:android:layout_weight
NFC-Typ
@ Mayra Ihre Lösung funktioniert hervorragend. android:orientation="vertical"Gibt es jedoch einen Grund, warum es nur mit und nicht mit der angegebenen horizontalen oder nicht angegebenen Ausrichtung funktioniert?
Eric
2
Diese Lösung behandelt jedoch nicht den Fall, dass die Listenansicht nicht lang genug ist, um den gesamten vertikalen Bereich des Bildschirms auszufüllen. Wenn die Listenansicht nur die Hälfte des Bildschirms ausfüllt, wird die Schaltfläche direkt unter der Listenansicht angezeigt und landet daher irgendwo in der Mitte des Bildschirms. Wie können wir in diesem Fall die Schaltfläche immer unten anzeigen lassen?
MediumOne
1
android: layout_weight = "0dip" ist nicht wahr, es sollte android: layout_weight = "0" sein, auf jeden Fall ist es ein guter Ansatz
Illegales Argument
2
Diese Antwort ist eine bessere Erklärung als alles, was mir in der offiziellen Dokumentation begegnet ist. Alles scheint nur Leuten zu erklären, die es bereits wissen.
user1725145
4
  <?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="#ffffff"
  >

    <ListView android:id="@+id/ListView01" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1">
    </ListView>

    <FrameLayout android:id="@+id/FrameLayout01" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content">
         <Button android:id="@+id/Button01" 
              android:layout_width="wrap_content" 
              android:layout_height="wrap_content" 
              android:text="button" 
              android:layout_gravity="center_horizontal">
        </Button>
    </FrameLayout>

  </LinearLayout>

Hier ist das Design, das Sie suchen. Versuch es.

Debarati
quelle
4

Ich brauchte zwei Knöpfe nebeneinander unten. Ich habe ein horizontales lineares Layout verwendet, aber das Zuweisen android:layout_height="0dp"und android:layout_weight="0"für das lineare Layout der Schaltflächen hat nicht funktioniert. Das Zuweisen android:layout_height="wrap_content"nur für das lineare Layout der Schaltflächen erfolgte. Hier ist mein Arbeitslayout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

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

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:orientation="horizontal">

        <Button
            android:id="@+id/new_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="New" />

        <Button
            android:id="@+id/suggest_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Suggest" />

    </LinearLayout>

</LinearLayout>
William T. Mallard
quelle
2

RelativeLayoutignoriert seine untergeordneten Elemente android:layout_widthoder android:layout_heightAttribute, wenn die untergeordneten Elemente Attribute haben, die ihre leftund right/ topund bottomWerte richtig definieren .

Um das Ergebnis auf dem rechten Bild zu erzielen und die Liste über der Schaltfläche anzuzeigen, sollte Ihr Layout folgendermaßen aussehen:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@android:id/button1"
        android:layout_alignParentTop="true"/>

    <Button
        android:id="@android:id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@android:string/ok"/>

</RelativeLayout>

Der Schlüssel ist zu definieren android:layout_alignParentTop(definiert topWert) und android:layout_above(definiert bottomWert) in Ihrem RecyclerView. Auf diese Weise RelativeLayoutwird ignoriert android:layout_height="match_parent"und das RecyclerViewwird über dem platziert Button.

Stellen Sie außerdem sicher, dass Sie prüfen android:layout_alignWithParentIfMissing, ob Sie ein komplexeres Layout haben und diese Werte noch definieren müssen.

jpmcosta
quelle
1

Ich verwende Xamarin Android und meine Anforderung entspricht genau der von William T. Mallard (siehe oben), dh einer ListView mit zwei nebeneinander angeordneten Schaltflächen. Die Lösung ist, dass diese Antwort in Xamarin Studio jedoch nicht funktioniert hat. Als ich die Höhe der ListView auf "0dp" stellte, verschwand die ListView einfach.

Mein funktionierender Xamarin-Android-Code lautet wie folgt:

<?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">

<ListView
    android:id="@+id/ListView1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:layout_above="@+id/ButtonsLinearLayout" />
<LinearLayout
    android:id="@id/ButtonsLinearLayout"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:orientation="horizontal"
    android:layout_alignParentBottom="true">
    <Button
        android:id="@+id/Button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <Button
        android:id="@+id/Button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout>
</RelativeLayout>

Ich habe ButtonsLinearLayout am unteren Bildschirmrand ausgerichtet und die ListView so eingestellt, dass sie über ButtonsLinearLayout liegt.

user1725145
quelle
0

@jclova Eine weitere Möglichkeit besteht layout-below=@+id/listviewiddarin, das relative Layout zu verwenden

Girish
quelle
0

In Ihrem relativen Layout ist die Höhe der Listenansicht match_parentfill_parent (für 2.1 und älter). Wenn Sie also das relative Layout verwenden möchten, deklarieren Sie zuerst Ihre Schaltfläche und dann Ihre Listenansicht. Stellen Sie die Position der Listenansicht wie über Ihrer Schaltflächen-ID ein Willst du die Schaltfläche immer unten, dann mache es ausrichtenParentBottom .. Snippet ist

<RelativeLayout 
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/rl1"><Button 
 android:layout_width="MATCH_PARENT" 
 android:layout_height="WRAP_CONTENT" 
 /><ListView 
 android:layout_width="MATCH_PARENT" 
 android:layout_height="0" 
 android:layout_above="@id/listview"/></RelativeLayout>

Dies verhindert, dass Ihre Listenansicht den gesamten Platz einnimmt und Ihre Schaltfläche angezeigt wird.

om252345
quelle
(Warnung: kleinere Android-Terminologie-Pedanterie voraus.) Der veraltete Begriff lautet "fill_parent", nicht "match_parent". Dies ist für mich sinnvoll, da "füllen" beide Dimensionen impliziert, während "übereinstimmen" "dasselbe wie" vorschlägt.
William T. Mallard
0

Dies ist die beste und einfachste Lösung für das Problem. Fügen android:layout_above="@id/nameOfId"Sie einfach das Layout hinzu, das Sie in Bezug auf dieses Layout verschieben möchten.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.sumeru.commons.activity.CommonDocumentUploadActivity">

    <ListView

        android:id="@+id/documentList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/verifyOtp" />


    <com.sumeru.commons.helper.CustomButton
        android:id="@+id/verifyOtp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@string/otp_verification" />
</RelativeLayout>
Rishabh Dhiman
quelle