Android: Как вы можете выровнять кнопку внизу и listview выше?

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

Если я использую relativeLayout/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>

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

Помогает ли кто-нибудь?

Спасибо.

Ответ 1

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

В вашем примере RelativeLayout вы устанавливаете высоту и ширину ListView на 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 проще.

Ответ 2

Мне нужно две кнопки бок о бок внизу. Я использовал горизонтальную линейную компоновку, но назначение 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>

Ответ 3

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

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

Ответ 4

Я использую 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.

Ответ 5

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

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

Это препятствует тому, чтобы ваш список отображался целиком и отображал вашу кнопку.

Ответ 6

@jclova еще одна вещь, которую вы можете сделать, это использовать [email protected]+id/listviewid в относительном макете

Ответ 7

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, если у вас более сложный макет, и вам все равно нужно определить эти значения.