Oto mój kod układu;
<?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">
<TextView android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>
<LinearLayout android:id="@+id/LinearLayout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom">
<EditText android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</EditText>
<Button android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
</LinearLayout>
To, jak to wygląda, znajduje się po lewej stronie, a to, co chcę, aby wyglądało, jest po prawej stronie.
Oczywistą odpowiedzią jest ustawienie TextView na fill_parent na wysokości, ale nie powoduje to pozostawienia miejsca dla przycisku lub pola wprowadzania.
Zasadniczo problem polega na tym, że chcę, aby przycisk wysyłania i wpis tekstu miały stałą wysokość u dołu, a widok tekstu wypełniał resztę miejsca. Podobnie w poziomym układzie liniowym chcę, aby przycisk wysyłania zawinął jego zawartość i aby wpis tekstu wypełnił resztę miejsca.
Jeśli polecenie pierwszemu elementowi w układzie liniowym zostanie wypełnione, to robi to dokładnie, nie pozostawiając miejsca na inne elementy. Jak uzyskać element, który jako pierwszy ma układ liniowy, aby wypełnić całą przestrzeń oprócz minimum wymaganego przez pozostałe elementy w układzie?
Względne układy były rzeczywiście odpowiedzią:
<?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">
<TextView
android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true">
</TextView>
<RelativeLayout
android:id="@+id/InnerRelativeLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<Button
android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
<EditText
android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_toLeftOf="@id/Button"
android:layout_height="wrap_content">
</EditText>
</RelativeLayout>
</RelativeLayout>
Odpowiedzi:
Współczesnym sposobem na to jest ConstraintLayout i ograniczenie dolnej części widoku do dolnej części ConstraintLayout za pomocą
app:layout_constraintBottom_toBottomOf="parent"
Poniższy przykład tworzy FloatingActionButton, który zostanie wyrównany do końca i dołu ekranu.
Dla porównania zachowam moją starą odpowiedź.
Przed wprowadzeniem ConstraintLayout odpowiedzią był układ względny .
Jeśli masz względny układ, który wypełnia cały ekran, powinieneś być w stanie
android:layout_alignParentBottom
przenieść przycisk na dół ekranu.Jeśli twoje widoki u dołu nie są pokazane we względnym układzie, być może układ nad nim zajmuje całą przestrzeń. W takim przypadku możesz umieścić widok, który powinien znajdować się na dole, najpierw w pliku układu i ustawić resztę układu nad widokami za pomocą
android:layout_above
. Dzięki temu widok z dołu zajmuje tyle miejsca, ile potrzebuje, a reszta układu może wypełnić całą resztę ekranu.źródło
android:layout_above
?that RelativeLayout
zajmuje pamięć i należy tego unikać, gdy tylko jest to możliwe.W
ScrollView
tym nie działa, ponieważRelativeLayout
wówczas nakładałyby się na to, co jestScrollView
na dole strony.Naprawiłem to za pomocą dynamicznego rozciągania
FrameLayout
:źródło
Możesz zachować początkowy układ liniowy, zagnieżdżając układ względny w układzie liniowym:
źródło
Powyższa odpowiedź (autorstwa Janusza) jest całkiem poprawna, ale osobiście nie czuję się w 100% komfortowo z RelativeLayouts, więc wolę wprowadzić „wypełniacz”, pusty TextView, taki jak ten:
przed elementem, który powinien znajdować się na dole ekranu.
źródło
Możesz to zrobić również za pomocą LinearLayout lub ScrollView. Czasami jest łatwiejsze do wdrożenia niż RelativeLayout. Jedyne, co musisz zrobić, to dodać następujący widok przed widokami, które chcesz wyrównać do dolnej części ekranu:
Tworzy to pusty widok, wypełniając puste miejsce i przesuwając kolejne widoki na dół ekranu.
źródło
To też działa.
źródło
1. Użyj
ConstraintLayout
w swoim głównym układzieI ustaw,
app:layout_constraintBottom_toBottomOf="parent"
aby układ u dołu ekranu:2. Użyj
FrameLayout
w swoim głównym układzieWystarczy ustawić
android:layout_gravity="bottom"
w swoim układzie3. Użyj
LinearLayout
w swoim głównym układzie (android:orientation="vertical"
)(1) Ustaw układ
android:layout_weight="1"
na górze układu(2) Ustaw dziecka
LinearLayout
doandroid:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"
Głównym atrybutem jest
ndroid:gravity="bottom"
pozwól dziecku wyświetlić na dole Układu.4. Użyj
RelativeLayout
w układzie głównymI ustaw,
android:layout_alignParentBottom="true"
aby układ u dołu ekranuWynik
źródło
Kontynuując eleganckie rozwiązanie Timores , stwierdziłem, że następujące tworzy pionowe wypełnienie w pionowym LinearLayout i poziome wypełnienie w poziomym LinearLayout:
źródło
Nie musisz nawet zagnieżdżać drugiego
relative
układu w pierwszym. Po prostu użyjandroid:layout_alignParentBottom="true"
w Button i EditText .źródło
Jeśli nie chcesz wprowadzać wielu zmian, możesz po prostu umieścić:
dla TextView o identyfikatorze jako
@+id/TextView
npźródło
Tworząc zarówno nagłówek, jak i stopkę , oto przykład:
Układ XML
Zrzut ekranu
źródło
Użyj poniższego kodu. Dopasuj przycisk do przycisku. To działa.
źródło
W takim przypadku zawsze używaj RelativeLayouts. LinearLayout nie jest przeznaczony do takiego użycia.
źródło
Użyj
android:layout_alignParentBottom="true"
w swoim<RelativeLayout>
.To na pewno pomoże.
źródło
W przypadku takiej hierarchii:
Najpierw złóż
android:fillViewport="true"
wniosek,ScrollView
a następnie złóżandroid:layout_alignParentBottom="true"
wniosekLinearLayout
.To działało dla mnie idealnie.
źródło
Można po prostu dać pogląd top dziecka (na TextView @ + id / TextView ) atrybut:
android:layout_weight="1"
.To zmusi wszystkie pozostałe elementy pod nim do dołu.
źródło
Można to zrobić również w układzie liniowym.
Podaj wysokość = 0dp i wagę = 1 do powyższego układu i tego, który chcesz na dole. Wystarczy napisać wysokość = zawartość opakowania i bez wagi.
Zapewnia zawartość zawijania dla układu (ten, który zawiera tekst edycji i przycisk), a następnie ten, który ma wagę, zajmuje resztę układu.
Odkryłem to przez przypadek.
źródło
Użyłem rozwiązania opublikowanego przez Janusza, ale do ostatniego widoku dodałem dopełnienie, ponieważ górną częścią mojego układu był ScrollView.
ScrollView zostanie częściowo ukryty, gdy rośnie wraz z zawartością. Użycie
android:paddingBottom
ostatniego widoku pomaga wyświetlić całą zawartość w ScrollView.źródło