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

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>

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


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.


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>

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.


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>

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.