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.

Layout Android - Actual (sinistra) e desiderata (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>
È stato utile?

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>

gravità = "bottom" galleggiare elementi LinearLayout il basso

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

Inserire descrizione dell'immagine qui

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

Inserire descrizione dell'immagine qui

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top