Макет 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 по-прежнему распространяется на кнопки.
Kleptine 05
1
Единственное, что я изменяю, это то, что я добавляю relativeLayout вокруг ListView, потому что я не могу вызвать addRule (RelativeLayout.ABOVE) в ListView.
Kleptine 05
2
Этот код должен работать нормально. android:layout_above="@id/testbutton"сохранит ListViewвышеуказанное Button.
CommonsWare 05
Когда я использую это, я получаю список, который останавливается над кнопкой, а затем начинаю внутреннюю прокрутку.
Ларс
7
Вы не называйте addRule(RelativeLayout.ABOVE)на RelativeLayout, либо. Вы называете это на RelativeLayout.LayoutParams. Затем вы добавляете ListViewв RelativeLayout, предоставляя это RelativeLayout.LayoutParams. Пожалуйста, подумайте о переходе на XML и его расширении для долгосрочной поддержки.
CommonsWare 05
57

У меня была одна и та же проблема целую вечность.

Решение сохранить ListView над кнопками, но не позволять им закрывать их, когда список длинный, - это установить android: layout_weight = "1.0" в ListView. Не устанавливайте layout_weight на кнопках, чтобы они оставались в своем естественном размере, иначе кнопки будут масштабироваться. Это работает с LinearLayout.

В Android ApiDemos есть пример: ApiDemos / res / layout / linear_layout_9.xml

Дэвид Ингрэм
источник
просто сэкономь мне пару часов. Не мог понять, почему кнопки не появлялись. :)
frostymarvelous
Я не совсем понимаю, почему это работает, но это работает :)
Bevor
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>
Патрик Кафка
источник
Проблема в том, что он выходит за пределы кнопок внизу, если список слишком длинный. Я не могу понять, как заставить его останавливаться над кнопками.
Kleptine 05
2
Если вы используете (я думаю, 1.5, возможно, даже 1.6), вы ДОЛЖНЫ иметь кнопки ДО ListView при использовании правил RelativeLayout - в противном случае макет еще не знает о кнопках, потому что он читает их по порядку, поэтому ваш ListView расширяется мимо них.
Tim H
У меня это не работает. Как говорит Тим ​​Х, для меня я должен поместить ListView после LinearLayout, а затем сделать ListView layout_above, как в ответе repoc выше.
Nemi
это не сработает, кнопка не будет на экране и не будет прокручиваться
Вайбхав Мишра
1

Я знаю, что этот пост довольно старый, но, чтобы ответить на вопрос исходного автора, причиной того, что код не работал, были кнопки. GetId () возвращает -1. Если вы собираетесь это сделать, вам нужно установить что-нибудь вроде call buttons.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

Самым простым решением было бы создать два линейных макета, один с кнопкой, а другой с представлением списка (обернуть содержимое по высоте кнопки и сопоставить родительский по высоте макета списка). тогда только сделайте вид прокрутки по макету с видом списка, и макет кнопки будет проигнорирован. Надеюсь, это поможет, извините, я не хотел писать код.

Пит
источник