Макет Android з ListView та кнопками


101

Добре, ця конкретна компонування мене просто дратує. І, схоже, не знайти способу створення listView з рядом кнопок внизу, щоб перегляд списку не поширювався на верхню частину кнопок, і тому кнопки завжди притискаються до нижньої частини екрана. Ось що я хочу:

видалено мертве посилання ImageShack

Здається, це повинно бути так легко, але все, що я спробував, не вдалося. Будь-яка допомога?

Ось мій поточний код:

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

Добре запитання, багато чортів збираються зациклюватися на цьому.
Signcodeindie

На щастя, дизайнер в Android насправді дуже милий. Тому, створюючи макет / інтерфейс користувача, спробуйте використовувати Designer / XML. Особливо для цього сценарію, оскільки це лише набір кнопок та ListView.
Subby

Відповіді:


137

Я думаю, що це те, що ти шукаєш.

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

Це те, що я в основному використовую, хоча я пишу макет на Java. ListView все ще поширюється на кнопки.
Клептин

1
Єдине, що я змінюю, це те, що я додаю відносний макет навколо ListView, тому що не можу викликати addRule (RelativeLayout.ABOVE) у ListView.
Клептин

2
Цей код повинен добре працювати. android:layout_above="@id/testbutton"буде тримати ListViewвищезгадане Button.
CommonsWare

Коли я використовую це, я отримую список, щоб зупинитися над кнопкою, а потім почати прокручувати внутрішньо.
lars

7
Ви не називайте addRule(RelativeLayout.ABOVE)на RelativeLayout, або. Ви називаєте це на a RelativeLayout.LayoutParams. Потім ви додаєте ListViewдо RelativeLayout, надаючи це RelativeLayout.LayoutParams. Будь-ласка, подумайте про перехід на XML та надуття його для довгострокового ремонту.
CommonsWare

57

У мене була така ж проблема протягом віків.

Рішенням збереження ListView над кнопками, але запобігання їх прикриванню, коли список довгий, - встановити на ListView android: layout_weight = "1.0". Залиште layout_weight на кнопках відключеним, щоб вони залишалися у натуральному розмірі, інакше кнопки будуть масштабуватися. Це працює з LinearLayout.

У Android ApiDemos є приклад: ApiDemos / res / layout / linear_layout_9.xml


просто врятуй мене ще пару годин. Не можу зрозуміти, чому кнопки ніколи не з’являлися. :)
frostymarvelous

Я не зовсім розумію, чому це працює, але це працює :)
Бевор

20

Я просто шукав відповідь на це питання, і це був один із перших результатів. Я відчуваю, ніби всі відповіді, включаючи той, який наразі обраний як "найкраща відповідь", не стосуються питання, про яке ставлять запитання. Проблема, про яку йдеться, полягає в тому, що відбувається перекриття двох компонентів Buttonі ListViewв тому, що ListView займає весь екран, а кнопка візуально плаває над (перед) ListView (блокуючи перегляд / доступ останнього пункт у ListView)

На основі відповідей, які я бачив тут і на інших форумах, я нарешті дійшов висновку, як вирішити це.

Спочатку у мене були:

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

Зверніть увагу на використання RelativeLayoutяк кореневого вузла.

Це остання, робоча версія, в якій Кнопка не перекриває 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>

Є лише дві відмінності. По-перше, я перейшов на використання LinearLayout. У цьому допоможе наступний біт, який додавали android:layout_weightдо могоListView

Я сподіваюся, що це допомагає.


Це вирішує, але хто б здогадався !? Коли ви даєте android:layout_alignParentBottomвсередині LinearLayoutбатьків, ADT каже "Недійсний параметр макета в LinearLayout: layout_alignParentBottom"!
Асвін Кумар

8

Найкращий спосіб - це відносний макет, який встановлює кнопки під переглядом списку. У цьому прикладі кнопки також розташовані в лінійному макеті, оскільки їх простіше розмістити поруч при однаковому розмірі.

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

Проблема полягає в тому, що він поширюється на верхню частину кнопок внизу, якщо перегляд списку занадто довгий. Я не можу зрозуміти, як змусити його зупинитися над кнопками.
Клептин

2
Якщо ви використовуєте (я думаю, 1.5, можливо, навіть 1.6), ВАМ ПОВИННІ мати кнопки ПЕРЕД ListView при використанні правил RelativeLayout - інакше макет ще не знає Кнопки, оскільки він читає їх по порядку, і саме тому ваш ListView розширюється повз них.
Тім Х

Це не працює для мене. Як каже Тім H, для мене я повинен поставити ListView після LinearLayout, а потім зробити компонування ListView_above, як відповідь repoc вище.
Немі

це не буде працювати, кнопка не буде на екрані, і не прокручується
Vaibhav Mishra

1

Я знаю, що ця публікація досить стара, але, щоб відповісти на запитання оригінального плаката, причиною коду не працювало кнопки.getId () повертає -1. Якщо ви збираєтесь це робити, вам потрібно встановити щось на зразок кнопок виклику.setId (10). Якщо ви це зробите, код працює чудово.


0

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

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

0

найпростішим рішенням було б створити два лінійних макета, один з кнопкою, а другий із переглядом списку (Оберніть вміст на висоту кнопки та збігайте з батьком на висоті макета списку). тоді лише зробіть подання прокрутки по макеті з переглядом списку, і макет кнопки буде проігноровано. сподіваюся, що це допомагає, вибачте, я не відчував, як виписувати код.

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