Układ systemu Android z ListView i przyciskami

101

W porządku, ten konkretny układ po prostu mnie denerwuje. Wydaje się, że nie mogę znaleźć sposobu na utworzenie listView, z rzędem przycisków u dołu, tak aby widok listy nie rozciągał się na górę przycisków, a zatem przyciski są zawsze przyciągane do dołu ekranu. Oto, czego chcę:

usunięto martwy link do ImageShack

Wydaje się, że powinno to być takie łatwe, ale wszystko, czego próbowałem, zawiodło. Jakaś pomoc?

Oto mój obecny kod:

    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);
Kleptine
źródło
Dobre pytanie, wielu programistów utknie na tym.
Signcodeindie
Na szczęście projektant Androida jest naprawdę słodki. Dlatego podczas tworzenia układu / interfejsu użytkownika spróbuj użyć projektanta / XML. Szczególnie w tym scenariuszu, ponieważ jest to tylko zestaw przycisków i ListView.
Subby

Odpowiedzi:

137

Myślę, że właśnie tego szukasz.

<?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>
lars
źródło
To jest to, czego w zasadzie używam, chociaż piszę układ w Javie. ListView nadal rozciąga się na przyciski.
Kleptine
1
Jedyną rzeczą, którą zmieniam, jest to, że dodaję relatywny układ wokół ListView, ponieważ nie mogę wywołać addRule (RelativeLayout.ABOVE) w ListView.
Kleptine
2
Ten kod powinien działać dobrze. android:layout_above="@id/testbutton"zachowa ListViewpowyższe Button.
CommonsWare,
Kiedy używam tego, lista zatrzymuje się nad przyciskiem, a następnie zaczynam przewijać wewnętrznie.
lars
7
Nie zadzwonić addRule(RelativeLayout.ABOVE)na zasadzie RelativeLayout, albo. Wołasz to na RelativeLayout.LayoutParams. Następnie dodajesz ListViewdo RelativeLayout, dostarczając to RelativeLayout.LayoutParams. Proszę rozważyć przejście na XML i zawyżenie go, aby zapewnić długoterminową konserwację.
CommonsWare,
57

Miałem ten sam problem od wieków.

Rozwiązaniem pozwalającym zachować ListView nad przyciskami, ale zapobiegając zakrywaniu ich, gdy lista jest długa, jest ustawienie android: layout_weight = "1.0" w ListView. Pozostaw element layout_weight na przyciskach nieustawiony, aby zachowały swój naturalny rozmiar, w przeciwnym razie przyciski zostaną przeskalowane. Działa to z LinearLayout.

Przykład w Android ApiDemos: ApiDemos / res / layout / linear_layout_9.xml

David Ingram
źródło
po prostu zaoszczędź mi kilka godzin więcej. Nie mogłem zrozumieć, dlaczego przyciski nigdy się nie pojawiły. :)
mroźno cudowne
Nie do końca rozumiem, dlaczego to działa, ale działa :)
Bevor
20

Właśnie szukałem odpowiedzi na to pytanie i był to jeden z pierwszych wyników. Wydaje mi się, że wszystkie odpowiedzi, w tym ta, która jest obecnie wybrana jako „najlepsza odpowiedź”, nie odnoszą się do zadawanego pytania. Problem, o którym mowa, polega na tym, że dwa składniki nakładają się na siebie Buttoni ListViewże ListView zajmuje cały ekran, a Button wizualnie unosi się nad (przed) ListView (blokuje widok / dostęp do ostatniego pozycja w ListView)

Na podstawie odpowiedzi, które widziałem tutaj i na innych forach, w końcu doszedłem do wniosku, jak rozwiązać ten problem.

Pierwotnie miałem:

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

Zwróć uwagę na użycie RelativeLayoutjako węzła głównego.

To jest ostateczna, działająca wersja, w której Button nie zachodzi na 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>

Są tylko dwie różnice. Najpierw przeszedłem na używanie LinearLayout. Pomoże to w następnym kawałku, który był dodawany android:layout_weightdo mojegoListView

Mam nadzieję, że to pomoże.

Dallas
źródło
To rozwiązuje, ale kto by zgadł !? Kiedy podajesz android:layout_alignParentBottomwewnątrz LinearLayoutrodzica, ADT mówi „Nieprawidłowy parametr układu w LinearLayout: layout_alignParentBottom”!
Aswin Kumar
8

Najlepszym sposobem jest względny układ, który ustawia przyciski poniżej widoku listy. W tym przykładzie przyciski są również w układzie liniowym, ponieważ łatwiej jest umieścić je obok siebie w jednakowej wielkości.

<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>
Patrick Kafka
źródło
Problem polega jednak na tym, że rozciąga się ponad górną część przycisków na dole, jeśli widok listy jest zbyt długi. Nie mogę wymyślić, jak to zatrzymać nad przyciskami.
Kleptine
2
Jeśli używasz (myślę, że 1.5, może nawet 1.6), MUSISZ mieć przyciski PRZED ListView podczas korzystania z reguł RelativeLayout - w przeciwnym razie układ nie jest jeszcze świadomy przycisków, ponieważ czyta je w kolejności, dlatego Twój ListView rozszerza się za nimi.
Tim H
To nie działa dla mnie. Jak mówi Tim H, dla mnie muszę umieścić ListView po LinearLayout, a następnie utworzyć ListView layout_above, tak jak odpowiedź repoc powyżej.
Nemi
to nie zadziała, przycisku nie ma na ekranie i nie można przewijać
Vaibhav Mishra
1

Wiem, że ten post jest dość stary, ale aby odpowiedzieć na pytanie pierwotnego autora, kod nie zadziałał to buttons.getId () zwraca -1. Jeśli zamierzasz to zrobić, musisz ustawić coś takiego jak call buttons.setId (10). Jeśli to zrobisz, kod działa dobrze.

Doo Dah
źródło
0

to powinno działać. aby przyciski znajdowały się również nad widokiem listy, umieść je w innym układzie liniowym.

<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>
Rhys
źródło
0

najłatwiejszym rozwiązaniem byłoby utworzenie dwóch układów liniowych, jednego z przyciskiem, a drugiego z widokiem listy (Zawijaj zawartość na wysokości przycisku i dopasuj do rodzica na wysokości układu listy). wtedy tylko przewiń widok układu z widokiem listy, a układ przycisków zostanie zignorowany. Mam nadzieję, że to pomoże, przepraszam, że nie miałem ochoty pisać kodu.

Pete
źródło