Ecco il mio codice di 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 appare è sulla sinistra e quello che voglio che appaia è sulla destra.
Layout Android - Attuale (sinistra) e desiderato (destra)]1
La risposta più ovvia è quella di impostare la TextView a fill_parent sull'altezza, ma questo fa sì che non venga lasciato spazio per il pulsante o il campo di inserimento.
Essenzialmente il problema è che voglio che il pulsante di invio e la voce di testo abbiano un'altezza fissa in basso e che la vista del testo riempia il resto dello spazio. Allo stesso modo, nel layout lineare orizzontale voglio che il pulsante di invio avvolga il suo contenuto e che la voce di testo riempia il resto dello spazio.
Se il primo elemento in un layout lineare è detto di fill_parent fa esattamente questo, non lasciando spazio per altri elementi. Come posso fare in modo che un elemento che è il primo in un layout lineare riempia tutto lo spazio a parte il minimo richiesto dal resto degli elementi del layout?
E' possibile;
I layout relativi erano effettivamente 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>
Il modo moderno per farlo è avere un ConstraintLayout e vincolare il fondo della vista al fondo del ConstraintLayout con app:layout_constraintBottom_toBottomOf="parent"
L'esempio seguente crea un FloatingActionButton che sarà allineato alla fine e al fondo 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, manterrò la mia vecchia risposta.
Prima dell'introduzione di ConstraintLayout la risposta era un layout relativo.
Se hai un layout relativo che riempie l'intero schermo dovresti essere in grado di usare android:layout_alignParentBottom
per spostare il pulsante nella parte inferiore dello schermo.
Se le tue viste in basso non sono mostrate in un layout relativo, allora forse il layout sopra di esse prende tutto lo spazio. In questo caso puoi mettere la vista che dovrebbe essere in basso per prima nel tuo file di layout e posizionare il resto del layout sopra le viste con android:layout_above
. Questo permette alla vista in basso di prendere tutto lo spazio di cui ha bisogno, e il resto del layout può riempire tutto il resto dello schermo.
In una ScrollView
questo non funziona, poiché il RelativeLayout
si sovrapporrebbe a qualsiasi cosa si trovi nella ScrollView
in fondo alla pagina.
Ho risolto usando un FrameLayout
che si estende dinamicamente:
<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>
Non hai nemmeno bisogno di annidare il secondo layout relativo
dentro il primo. Basta usare l'opzione android:layout_alignParentBottom="true"
nel Button e EditText.