Android: Як можна вирівняти кнопку внизу та перегляд списку вище?


76

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

Якщо я використовую relativeLayout / FrameLayout, він вирівнюється, але listView опускається до самого боттона.

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

введіть тут опис зображення

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>

Вище двох кодів працює лише як перше зображення. Я хочу другого образу.

Хто-небудь може допомогти?

Дякую.

Відповіді:


182

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

У вашому RelativeLayoutприкладі ви встановите для ListViews висоту та ширину 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.

Ви можете виконати щось подібне, використовуючи a RelativeLayout, але якщо це лише ці два пункти, то, на мою думку, a LinearLayoutпростіше.


5
Вирішив моє питання, але android:weightповинен бути:android:layout_weight
Хлопець з NFC

@Mayra Ваше рішення чудово працює. Однак чи є причина, з якою вона працює лише з, android:orientation="vertical"а не з горизонтальною орієнтацією чи не вказана орієнтація?
Ерік

2
Але це рішення не обробляє випадок, коли перегляд списку недостатньо довгий, щоб заповнити весь вертикальний простір екрана. Якщо перегляд списку просто заповнює половину екрана, тоді кнопка з'являється прямо під переглядом списку і, отже, опиняється десь посередині екрана. У цьому випадку, як ми можемо зробити так, щоб кнопка відображалася завжди внизу?
MediumOne

1
android: layout_weight = "0dip" не відповідає дійсності, це повинно бути android: layout_weight = "0" у будь-якому випадку це хороший підхід
Незаконні аргументи

2
Ця відповідь є кращим поясненням, ніж будь-що, що я зустрічав в офіційній документації, і все, здається, просто пояснює речі людям, які це вже знають.
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>

Ось дизайн, який ви шукаєте. Спробуй це.


4

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

2

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

Я використовую Xamarin Android, і моя вимога точно така ж, як Вільям Т. Маллард, вище, тобто ListView з 2-ма поруч кнопками під ним. Рішення полягає в тому, що ця відповідь не спрацювала в 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

@jclova Ще одна річ, яку ти можеш зробити, це використовувати layout-below=@+id/listviewidу відносному макеті


0

У вашому відносному макеті висота перегляду списку - 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>

Це запобігає зайняттю вашого перегляду списку і появі вашої кнопки.


(Попередження: попереду незначна педантичність термінології Android.) Застарілим терміном є "fill_parent", а не "match_parent". Для мене це має сенс, оскільки "заповнення" передбачає обидва виміри, тоді як "збіг" передбачає "те саме, що".
William T. Mallard

0

Це буде найкращим і найпростішим рішенням проблеми. Просто додайте android:layout_above="@id/nameOfId"в макет, який ви хочете перенести вище щодо цього макета.

<?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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.