Come faccio align vista nella parte inferiore dello schermo?
-
24-09-2019 - |
Domanda
Ecco il mio codice del layout;
<?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>
Quello che questo appare come è a sinistra e quello che voglio farlo sembrare come si trova sulla destra.
La risposta ovvia è quella di impostare il TextView per fill_parent su altezza, ma questo fa sì che non c'è spazio per essere lasciato per il campo tasto o la messa.
In sostanza il problema è che io voglio il pulsante di invio e l'entrata testo da un'altezza fissa in basso e la vista del testo per riempire il resto dello spazio. Allo stesso modo, nel layout lineare orizzontale Voglio che il pulsante di invio per avvolgere il suo contenuto e per l'immissione di testo per riempire il resto dello spazio.
Se il primo elemento in un layout lineare è detto di fill_parent lo fa esattamente questo, non lasciando spazio per altre voci. Come faccio ad avere un oggetto che è il primo in un layout lineare per riempire tutto lo spazio a parte il minimo richiesto dal resto degli elementi nel layout?
layout relativi fosse davvero la risposta:
<?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>
Soluzione
Il modo moderno di fare questo è di avere un ConstraintLayout e vincolare il fondo della vista sul fondo del ConstraintLayout con app:layout_constraintBottom_toBottomOf="parent"
L'esempio seguente crea un FloatingActionButton che sarà allineata alla fine e la parte inferiore dello schermo.
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent">
<android.support.design.widget.FloatingActionButton
android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout>
Per riferimento, terrò la mia vecchia risposta.
Prima dell'introduzione ConstraintLayout la risposta è stata un disposizione relativa .
Se si dispone di un layout relativo che riempie l'intero schermo si dovrebbe essere in grado di utilizzare android:layout_alignParentBottom
per spostare il pulsante nella parte inferiore dello schermo.
Se le vostre opinioni in fondo non sono mostrati in un layout relativo allora forse la disposizione di cui sopra si prende tutto lo spazio. In questo caso si può mettere la vista, che dovrebbe essere in fondo, prima nel file di layout e posizionare il resto del layout di sopra delle opinioni con android:layout_above
. Ciò consente la vista dal basso per occupare tutto lo spazio di cui ha bisogno, e il resto del layout può riempire tutto il resto dello schermo.
Altri suggerimenti
In un ScrollView
questo non funziona, come il RelativeLayout
sarebbe poi sovrapposizione tutto ciò che è nel ScrollView
in fondo alla pagina.
I risolto utilizzando un FrameLayout
che si estende in modo dinamico:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:fillViewport="true">
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<!-- content goes here -->
<!-- stretching frame layout, using layout_weight -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</FrameLayout>
<!-- content fixated to the bottom of the screen -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- your bottom content -->
</LinearLayout>
</LinearLayout>
</ScrollView>
È possibile mantenere il layout lineare iniziale nidificazione il layout relativo all'interno del layout lineare:
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button android:text="submit"
android:id="@+id/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true">
</Button>
<EditText android:id="@+id/EditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/Button"
android:layout_alignParentBottom="true">
</EditText>
</RelativeLayout>
</LinearLayout>
La risposta di cui sopra (da Janusz) è del tutto corretto, ma io personalmente non mi sento al 100% confortevole con RelativeLayouts, quindi preferisco di introdurre un 'riempitivo', TextView vuoto, in questo modo:
<!-- filler -->
<TextView android:layout_height="0dip"
android:layout_width="fill_parent"
android:layout_weight="1" />
prima che l'elemento che dovrebbe essere nella parte inferiore dello schermo.
Si può fare questo con un LinearLayout o uno ScrollView, anche. A volte è più facile da implementare che un RelativeLayout. L'unica cosa che dovete fare è aggiungere la seguente vista prima Viste da allineare alla parte inferiore dello schermo:
<View
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
Ciò crea una vista vuoto, riempiendo lo spazio vuoto e spingendo i prossimi vista sul fondo dello schermo.
Questo funziona anche.
<LinearLayout
android:id="@+id/linearLayout4"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_below="@+id/linearLayout3"
android:layout_centerHorizontal="true"
android:orientation="horizontal"
android:gravity="bottom"
android:layout_alignParentBottom="true"
android:layout_marginTop="20dp"
>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
/>
</LinearLayout>
1. Utilizzare ConstraintLayout
nella directory principale del layout
E app:layout_constraintBottom_toBottomOf="parent"
set di lasciare che il Layout nella parte inferiore dello schermo:
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent">
</LinearLayout>
2. Utilizzare FrameLayout
nella directory principale del layout
Proprio set android:layout_gravity="bottom"
nel layout
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="horizontal">
</LinearLayout>
3. Utilizzare LinearLayout
nella root Layout (android:orientation="vertical"
)
(1) Impostare un android:layout_weight="1"
il layout sulla parte superiore del vostro layout
<TextView
android:id="@+id/TextView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="welcome" />
(2) Impostare il LinearLayout
bambino per android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"
L'attributo principale è ndroid:gravity="bottom"
, lasciare che il bambino vista sulla parte inferiore del layout.
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom"
android:orientation="horizontal">
</LinearLayout>
4. Utilizzare RelativeLayout
nella root layout
E insieme android:layout_alignParentBottom="true"
per lasciare che il Layout nella parte inferiore dello schermo
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
</LinearLayout>
Output
A seguito su di Timores soluzione elegante , ho trovato che il seguente crea un riempimento verticale in un LinearLayout verticale ed orizzontale, un riempimento in un LinearLayout orizzontale:
<Space
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
non hanno nemmeno bisogno di nido secondo layout relative
all'interno del primo. Basta usare il android:layout_alignParentBottom="true"
nel Tasto e EditText .
Se non si desidera apportare molti cambiamenti, allora si potrebbe semplicemente mettere:
android:layout_weight="1"
per il TextView avere ID come @+id/TextView
cioè
<TextView android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</TextView>
La creazione sia intestazione e piè di pagina , ecco un esempio:
Layout XML
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/backgroundcolor"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="40dp"
android:background="#FF0000">
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:background="#FFFF00">
</RelativeLayout>
</RelativeLayout>
Cattura schermo
Usa il codice di seguito. Allineare il pulsante per buttom. Sta funzionando.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_back"
android:layout_width="100dp"
android:layout_height="80dp"
android:text="Back" />
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.97"
android:gravity="center"
android:text="Payment Page" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Submit"/>
</LinearLayout>
</LinearLayout>
Per un caso come questo, utilizzare sempre RelativeLayouts. Un LinearLayout non è destinato a tale uso a.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/db1_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- Place your layout here -->
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:orientation="horizontal"
android:paddingLeft="20dp"
android:paddingRight="20dp" >
<Button
android:id="@+id/setup_macroSavebtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Save" />
<Button
android:id="@+id/setup_macroCancelbtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel" />
</LinearLayout>
</RelativeLayout>
Usa android:layout_alignParentBottom="true"
nel vostro <RelativeLayout>
.
Questo sarà sicuramente di aiuto.
Nel caso in cui si dispone di una gerarchia simile a questo:
<ScrollView>
|-- <RelativeLayout>
|-- <LinearLayout>
In primo luogo, si applicano android:fillViewport="true"
al ScrollView
e quindi applicare android:layout_alignParentBottom="true"
al LinearLayout
.
Questo ha funzionato perfettamente per me.
<ScrollView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scrollbars="none"
android:fillViewport="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/linearLayoutHorizontal"
android:layout_alignParentBottom="true">
</LinearLayout>
</RelativeLayout>
</ScrollView>
Si può solo dare al vostro bambino vista superiore (la TextView @ + id / TextView ) un attributo:
android:layout_weight="1"
.
Questo costringerà tutti gli altri elementi sottostanti al fondo.
ho usato la soluzione Janusz postato, ma ho aggiunto imbottitura per l'ultima vista in quanto la parte superiore del mio layout era uno ScrollView.
Lo ScrollView sarà in parte nascosta come cresce con il contenuto. Utilizzando android:paddingBottom
sull'ultimo View aiuta a mostrare tutto il contenuto nel ScrollView.
Questo può essere fatto con un layout lineare, troppo.
Basta fornire Height = 0DP e il peso = 1 al layout di cui sopra e quello che si desidera sul fondo. Basta scrivere height = contenuti involucro e senza peso.
Si fornisce contenuti impacco per il layout (quello che contiene il testo di modifica e pulsante) e poi quella che ha un peso occupa il resto del layout.
ho scoperto questo per caso.