Android: Как вы можете выровнять кнопку внизу и список сверху? - PullRequest
72 голосов
/ 08 февраля 2011

Я хочу иметь кнопку внизу списка.

Если я использую относительныеLayout / FrameLayout, он выравнивается, но listView опускается до самого нижнего.

(За кнопкой навнизу)

enter image description here

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>

Выше двух кодов работают только как первое изображениеЧто я хочу, так это второе изображение.

Кто-нибудь может помочь?

Спасибо.

Ответы [ 7 ]

174 голосов
/ 08 февраля 2011
Цель

A FrameLayout состоит в том, чтобы накладывать друг на друга вещи.Это не то, что вам нужно.

В вашем примере RelativeLayout вы устанавливаете высоту и ширину ListView s равными MATCH_PARENT, это заставит его занимать столько же места, что и его родительи, таким образом, занимают все пространство на странице (и закрывает кнопку).

Попробуйте что-то вроде:

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

layout_weight определяет, как использовать дополнительное пространство.Button не хочет растягиваться за пределы требуемого пространства, поэтому его вес равен 0. ListView хочет занять все дополнительное пространство, поэтому он имеет вес 1.

Вы могли бы сделать что-то подобное, используя RelativeLayout, но если это только эти два пункта, то я думаю, что LinearLayout проще.

4 голосов
/ 15 ноября 2013

Мне понадобились две кнопки рядом внизу. Я использовал горизонтальную линейную разметку, но назначение android:layout_height="0dp" и android:layout_weight="0" для линейной разметки кнопок не сработало. Назначение android:layout_height="wrap_content" только для линейного расположения кнопок. Вот мой рабочий макет:

<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>
4 голосов
/ 08 февраля 2011
  <?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>

Вот дизайн, который вы ищете. Попробуй.

2 голосов
/ 02 декабря 2016

RelativeLayout будет игнорировать свои дочерние атрибуты android:layout_width или android:layout_height, если дочерние элементы имеют атрибуты, которые правильно определяют их значения left и right или top и bottom соответственно.

Для достижения результата на правом изображении, отображающем список над кнопкой, ваш макет должен выглядеть следующим образом:

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

Ключ должен определить android:layout_alignParentTop (определяет top значение) и android:layout_above (определяет bottom значение) в вашем RecyclerView. Таким образом, RelativeLayout будет игнорировать android:layout_height="match_parent", а RecyclerView будет расположен над Button.

Кроме того, убедитесь, что вы изучили android:layout_alignWithParentIfMissing, если у вас более сложный макет и вам все еще нужно определить эти значения.

1 голос
/ 27 октября 2015

Я использую Xamarin Android, и мои требования точно такие же, как у Уильяма Т. Малларда, описанные выше, то есть ListView с двумя кнопками рядом друг с другом. Решение состоит в том, что этот ответ не работал в Xamarin Studio, однако - когда я установил высоту ListView равным «0dp», ListView просто исчез.

Мой рабочий код Xamarin для Android выглядит следующим образом:

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

Я выровнял ButtonsLinearLayout по нижней части экрана и установил ListView выше ButtonsLinearLayout.

0 голосов
/ 29 марта 2012

@ jclova еще одна вещь, которую вы можете сделать, это использовать layout-below=@+id/listviewid в относительном расположении

0 голосов
/ 08 февраля 2011

В вашем относительном макете высота списка составляет match_parent, который представляет собой fill_parent (для версии 2.1 и старше), поэтому лучшим решением будет, если вы хотите использовать относительный макет, затем сначала объявите свою кнопку, а затем свой список, сделайте позицию списка как указано вышеваш идентификатор кнопки, если вы хотите, чтобы кнопка всегда была внизу, тогда установите ее alignParentBottom .. Snippet is

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

Это не позволит вашему списку занять все место и заставить вашу кнопку появиться ..

...