Chcę pokazać przycisk pod a ListView
. Problem polega na tym, że jeśli ListView
zostanie wydłużony (dodane elementy ...), przycisk zostanie wypchnięty z ekranu.
Próbowałem LinearLayout
z wagami (jak zasugerowano w Androidzie: dlaczego nie ma maxHeight dla widoku? ), Ale albo źle zrozumiałem wagi, albo po prostu nie działało.
Również znalazłem gdzieś wskazówkę dotyczącą użycia pliku RelativeLayout
. ListView
Będzie wówczas ustawiony nad przyciskiem z android:layout_above
param.
Problem polega na tym, że nie wiem, jak później ustawić przycisk. W przykładzie, który znalazłem, widok poniżej ListView
został dostosowany za pomocą android:layout_alignParentBottom
, ale nie chcę, aby mój przycisk przylgnął do dolnej części ekranu.
Jakieś pomysły poza zastosowaniem metody setHeight i obliczeniem wymaganej przestrzeni?
Edycja: otrzymałem wiele przydatnych odpowiedzi.
Rozwiązanie bigstone & user639183 działało prawie idealnie. Musiałem jednak dodać dodatkowe wypełnienie / margines na dole przycisku, ponieważ nadal byłby wypychany do połowy z ekranu (ale potem zatrzymany)
Odpowiedź Adinii ze względnym układem jest w porządku tylko wtedy, gdy chcesz, aby przycisk był przymocowany do dołu ekranu. Nie to chciałem, ale nadal może być przydatne dla innych.
Rozwiązanie AngeloS było tym, które wybrałem na koniec, ponieważ stworzyło takie efekty, jakie chciałem. Jednak dokonałem dwóch drobnych zmian w obszarze
LinearLayout
wokół przycisku:Po pierwsze, ponieważ nie chciałem mieć żadnych wartości bezwzględnych w moim układzie, zmieniłem
android:layout_height="45px"
nawrap_content
, co również działa dobrze.Po drugie, ponieważ chciałem, aby przycisk był wyśrodkowany w poziomie, co jest obsługiwane tylko w pionie
LinearLayout
, zmieniłem android: orientacja = "pozioma" na "pionowa".
AngeloS stwierdził również w swoim początkowym poście, że nie był pewien, czy
android:layout_weight="0.1"
parametr wLinearLayout
okolicyListView
miał jakikolwiek wpływ; Właśnie próbowałem i faktycznie działa! Bez przycisku przycisk zostaje ponownie wypchnięty z ekranu.
źródło
android:layout_alignParentBottom="true"
. Ale żeby było jasne, czy chcesz, aby przycisk pozostawał dołączony do dołu ListView, gdy jest kilka elementów? Jeśli tak, zobacz, co mówi Rich.Odpowiedzi:
Miałem dokładnie ten problem i aby go rozwiązać, stworzyłem dwa osobne,
LinearLayouts
aby pomieścić odpowiednioListView
iButton
. Stamtąd włożyłem obaLinear Layout
i ustawiłem ten pojemnikandroid:orientation
navertical
. Ustawiłem również wagę tego, wLinearLayout
którym mieściListView
się,0.1
ale nie wiem, czy to ma jakiś wpływ. Stamtąd możesz ustawić wysokość dolnego pojemnika (z przyciskiem) na dowolną wysokość.EDYTUJ to mam na myśli:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.1" android:orientation="horizontal"> <ListView android:id="@+id/ListView01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:dividerHeight="2px"></ListView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="45px" android:background="@drawable/drawable" android:orientation="horizontal"> <Button android:id="@+id/moreButton" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:background="@drawable/btn_more2" android:paddingRight="20px" /> </LinearLayout>
Powyższe rozwiązanie naprawi przycisk na dole ekranu.
Aby przycisk znajdował się swobodnie u dołu listy, zmień wysokość
ListView01
nawrap_content
:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.1" android:orientation="horizontal"> <ListView android:id="@+id/ListView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:dividerHeight="2px"></ListView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="45px" android:background="@drawable/drawable" android:orientation="horizontal"> <Button android:id="@+id/moreButton" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:background="@drawable/btn_more2" android:paddingRight="20px" /> </LinearLayout>
źródło
<div
tagów w HTML .. to tylko opakowanie i to rozwiązanie zdecydowanie działa.Rozwiązałem ten problem w kodzie, ustawiając wysokość widoku listy tylko wtedy, gdy ma więcej niż 5 elementów:
if(adapter.getCount() > 5){ View item = adapter.getView(0, null, listView); item.measure(0, 0); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, (int) (5.5 * item.getMeasuredHeight())); listView.setLayoutParams(params); }
Zwróć uwagę, że ustawiłem maksymalną wysokość na 5,5 razy większą niż wysokość pojedynczego elementu, aby użytkownik wiedział na pewno, że musi wykonać przewijanie! :)
źródło
Podczas ostatniej edycji wystarczy dodać również
android:layout_above="@+id/butt1"
kod ListView.Aby pokazać Ci (i wszystkim tutaj, którzy wcześniej próbowali odpowiedzieć), że naprawdę nie musisz używać więcej niż jednej
RelativeLayout
, oto poprawiony kod :<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/bkg"> <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TextView1" android:layout_alignParentTop="true"> </TextView> <TextView android:id="@+id/textView2" android:layout_below="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TextView2" android:layout_centerHorizontal="true"> </TextView> <Button android:id="@+id/butt1" android:text="string/string3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true"> </Button> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="2dip" android:layout_marginBottom="2dip" android:drawSelectorOnTop="false" android:visibility="visible" android:layout_below="@+id/textView2" android:layout_above="@+id/butt1" /> </RelativeLayout>
i wynik , używając losowej listy:
źródło
Za pomocą
LinearLayout
ustaw wysokość swojegoListView
iButton
dowrap_content
oraz dodaj wagę = 1 doListView
. To powinno działać tak, jak chcesz.I tak, ustaw
layout_gravity
wartośćButton
nabottom
źródło
Znalazłem sposób na zrobienie tego bez użycia zagnieżdżonych kontenerów, zainspirowany rozwiązaniem AngeloS.
Użyłem litery
LinearLayout
z orientacją pionową, która maListView
i przycisk. Ustawiłemandroid:layout_weight="0.1"
dlaListView
.Udaje mu się zawsze umieścić przycisk na dole listy. Przycisk nie jest wypychany z ekranu, gdy lista rośnie.
<ListView android:id="@+id/notes_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.1" /> <Button android:id="@+id/create_note_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onCreateButtonClicked" android:text="@string/create_notes" />
źródło
android:layout_height="wrap_content"
LinearLayout, tak jak w twoim rozwiązaniu, działa idealnie i nie tylko na 4.4.3, ale ponieważ Sparkle o tym nie wspomniał, próbowałem gomatch_parent
wcześniej.RelativeLayout
jest rozwiązaniem, jeśli nie chcesz, aby przycisk znajdował się zbyt blisko dołu, możesz dodać marginesy (wypełnienie przycisku mogłoby go złamać, ponieważ używa tła z 9 łatami i ustawia własne wypełnienie).Byłoby tak samo, gdybyś użył a
LinearLayout
: sposobem na osiągnięcie tego, co chcesz, jest ustawienieListView
wysokości = 0 i wagi = 1, a dla przycisku wysokość = zawartość_zawijania i waga = 0.(ustawienie obu na wrap_content, jak powiedział użytkownik639183, nie ograniczyListView
wysokości).źródło
ListView
wysokośćPrawdopodobnie możesz to wykonać, używając kontenerów zagnieżdżonych. Możliwe, że będziesz musiał owinąć Button w drugim (wewnętrznym) pojemniku, aby zajmował więcej miejsca, i po prostu wyrównaj Button do górnej części pojemnika wewnętrznego.
Możliwe coś takiego:
RelativeLayout
- ListView
- RelativeLayout
---- Przycisk
Używając różnych opcji wyrównania w dwóch kontenerach, powinieneś być w stanie to zadziałać.
źródło
android:layout_marginTop="30dip"
do przycisku, jeśli chcesz na przykład więcej miejsca między listą a przyciskiem.Oto najczystszy sposób na zrobienie tego:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ListView android:id="@+id/ListView01" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:dividerHeight="2px"> </ListView> <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/drawable" > <Button android:background="@drawable/btn_more2" android:id="@+id/moreButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:paddingRight="20px" /> </LinearLayout> </LinearLayout>
Jest podobny do rozwiązania Angelosa, ale nie potrzebujesz układu liniowego, który otacza ListView. Możesz również użyć FrameLayout, który jest lżejszy w porównaniu do LinearLayout, aby zawinąć Button.
źródło
Ideę w bardzo dobrych rozwiązaniach zarysowuje:
Oba wydają się działać doskonale przynajmniej w wersji 4.4.3.
Nadal musiałem poświęcić trochę czasu na pisanie kodu testowego, aby go sprawdzić i potwierdzić każdą metodę. Poniżej znajduje się samodzielny, wymagany minimalny kod testowy.
Layout jest oparty na rozwiązaniu Sparkle, ponieważ zawiera mniej zagnieżdżonych układów. Został również zaktualizowany, aby odzwierciedlić obecne kontrole LINT.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context="MainActivity" > <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Grow List" tools:ignore="HardcodedText" /> </LinearLayout>
Aktywność zawiera standardowy kod do samodzielnego przetestowania rozwiązania.
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ListView listview = (ListView)findViewById(R.id.listview); final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>()); adapter.setNotifyOnChange(true); listview.setAdapter(adapter); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int count = adapter.getCount(); adapter.add(String.valueOf(count)); listview.setSelection(count); } }); } }
Zapraszam do dodawania lub ulepszania, ponieważ jest to „wiki społeczności”.
źródło
Spróbuj użyć RelativeLayout z przyciskiem na dole. Ustaw wysokość układu jako „wrap_content”. Nie próbowałem tego. Po prostu pomysł
źródło
w LinearLayout, po prostu dodaj
android:layout_weight="1"
do siebie ListViewźródło
Oto, co zadziałało dla mnie ...
if(adapter.getCount() > 3){ View item = adapter.getView(0, null, impDateListView); item.measure(0, 0); LayoutParams params = impDateListView.getLayoutParams(); params.width = LayoutParams.MATCH_PARENT; params.height = 3 * item.getMeasuredHeight(); impDateListView.setLayoutParams(params); }
Uwaga: parametr params.width = ... należy również ustawić ...
Powyższy przykład dotyczy użycia TableRow i ListView w TableRow ...
źródło
zawiń zawartość w układzie liniowym
w widoku listy dodaj: android: layout_weight = "1"
w Twoim Button ustaw stałą wysokość
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ListView android:id="@+id/my_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1"> </ListView> <Button android:text="Button" android:layout_width="match_parent" android:layout_height="50dp"/> </LinearLayout>
źródło
Jeśli chcesz, aby zawartość poniżej widoku listy przesuwała się w dół w miarę dodawania elementów do listy, wypróbuj następujące rozwiązanie:
Dodaj dopełnienie dodatnie na dole widoku listy i dopełnienie ujemne na górze „stopki”. To zadziała w układzie liniowym lub względnym.
<ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="50dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="-50dp"/>
źródło
Ponieważ nie ma atrybutu MaxHeight, najlepszym rozwiązaniem jest ustawienie wysokości ListView na określoną wartość lub użycie
wrap_content
.źródło
Rozwiązałem ten problem, umieszczając ListView wewnątrz ScrollView. Lintowi się to nie podobało, ale dodając minHeight i ustawiając fillViewport na true, mam niezły wynik.
<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="1dp" android:layout_marginRight="1dp" android:minHeight="100dp" android:fillViewport="true" android:fadeScrollbars="false" android:paddingTop="2dp" android:orientation="vertical" android:scrollbarAlwaysDrawVerticalTrack="true" > <ListView android:id="@+id/workoutAElistRoutines" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="fill_vertical" android:background="@drawable/dialog_inner_border_tan" android:choiceMode="singleChoice" android:orientation="vertical" android:paddingLeft="3dp" android:paddingRight="3dp" > </ListView> </ScrollView>
źródło