Metti i pulsanti nella parte inferiore dello schermo con LinearLayout?


136

Ho il seguente codice, come posso farlo in modo che i 3 pulsanti siano in fondo?

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dp"
        android:gravity="center"
        android:text="@string/observer"
        android:textAppearance="?android:attr/textAppearanceLarge"
        tools:context=".asdf"
        android:weight="1" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <Button
            android:id="@+id/button1"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="145dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center"
            android:text="1" />

        <Button
            android:id="@+id/button2"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="145dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center"
            android:text="2" />

        <Button
            android:id="@+id/button3"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="145dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center"
            android:text="3" />
    </LinearLayout>


in che cosa consiste questa visione? un layout di cornice? layout relativo?
Nirvana Tikku,

1
Il tuo codice contiene un refuso. Con android:weight="1"che probabilmente significava android:layout_weight="1". Questo non è il tuo problema però.
Brian Attwell,


Potrebbe essere più semplice utilizzare il layout dello spazio presente nella casella degli strumenti. Puoi posizionarlo sopra il layout esistente sopra i pulsanti e ridimensionarlo e li spingerà verso il basso.
Alex

Risposte:


268

Devi assicurarti quattro cose:

  • Il tuo esterno LinearLayouthalayout_height="match_parent"
  • Il tuo interno LinearLayoutha layout_weight="1"elayout_height="0dp"
  • Il tuo TextViewhalayout_weight="0"
  • Hai impostato correttamente la gravità sul tuo interno LinearLayout: android:gravity="center|bottom"

Si noti che fill_parentnon significa "occupare tutto lo spazio disponibile". Tuttavia, se si utilizza layout_height="0dp"con layout_weight="1", una vista occuperà tutto lo spazio disponibile ( Impossibile ottenere il layout corretto con "fill_parent" ).

Ecco un po 'di codice che ho scritto rapidamente che utilizza due LinearLayout in modo simile al tuo codice.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="@string/cow"
        android:layout_weight="0"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:gravity="center|bottom"
        android:orientation="vertical" >

        <Button
            android:id="@+id/button1"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="145dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center"
            android:text="1" />

        <Button
            android:id="@+id/button2"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="145dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center"
            android:text="2" />

        <Button
            android:id="@+id/button3"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="145dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center"
            android:text="3" />
    </LinearLayout>

</LinearLayout>

Il risultato è simile al seguente:

inserisci qui la descrizione dell'immagine


Votato solo per la nota su come ottenere una vista per riempire tutto lo spazio disponibile! Grazie, ottima risposta!
Lisa,

Quegli avvertimenti su Lint ...!
Yousha Aleayoub,

Questa non è la soluzione migliore perché non puoi impostare la vista al centro della schermata rimanente ......................... quindi il premio per la migliore soluzione va a questo risposta - stackoverflow.com/a/26140793/4741746
gosavi sushant

Puoi per favore descrivere il significato layout_weight="0"o cosa fa effettivamente?
Rahat Zaman,

23

Puoi usare a RelativeLayoute allinearlo verso il basso conandroid:layout_alignParentBottom="true"


1
non è possibile utilizzare il layout lineare?
gioco

È. Come già detto da @AND_DEV: Usa layout_weight="1". Con questo il tuo LinearLayout occuperà l'altezza rimasta sullo schermo; ora puoi impostare la gravità dei tuoi pulsanti in basso.
Ahmad,

1
I rilievi relativi sono difficili da leggere, quasi mai fanno quello che vuoi e sono generalmente terribili da mantenere. Prenderò il colpo di prestazione di 30 linearlayouts su 1 relativelayout in qualsiasi giorno della settimana, semplicemente perché consente di risparmiare ore di frustrazione frustrante.
G_V,

@Ahmed penso che la domanda posta sia molto chiara come per LinearLayout, ma ha risposto per RelativityLayout e Brian Attwell ha risposto chiaramente con Android: gravità = "center | bottom"!
Gopi.cs,

@ Gopi.cs Non sono davvero sicuro del perché stai commentando una risposta che ho dato più di 6 (!) Anni fa. È il 2019, basta usare un ConstraintLayout.
Ahmad,

12

Crea layout relativo e all'interno di quel layout crea il tuo pulsante con questa linea

android:layout_alignParentBottom="true"

2
aggiungendo android:layout_centerHorizontal="true"inoltre al centro anche in senso orizzontale, questa è un'ottima soluzione.
Thomas Mondel,

1
Grande trucco. Grazie
zackygaurav il

4

prima crea il nome del file e footer.xml inserisci questo codice al suo interno.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="78dp"
    android:layout_gravity="bottom"
    android:gravity="bottom"
 android:layout_weight=".15"
    android:orientation="horizontal"
    android:background="@drawable/actionbar_dark_background_tile" >
    <ImageView
        android:id="@+id/lborder"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/overlay" />
    <ImageView
        android:id="@+id/unknown"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/notcolor" />
    <ImageView
        android:id="@+id/open"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/openit"
        />
    <ImageView
        android:id="@+id/color"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/colored" />
        <ImageView
        android:id="@+id/rborder"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/frames"
        android:layout_weight=".14" />


</LinearLayout>  

quindi crea header.xml e inserisci questo codice al suo interno .:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="@dimen/action_bar_height"
    android:layout_gravity="top"
    android:baselineAligned="true"
    android:orientation="horizontal"
    android:background="@drawable/actionbar_dark_background_tile" >
    <ImageView
        android:id="@+id/contact"
        android:layout_width="37dp"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_weight=".18"
        android:scaleType="fitCenter"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/logo"/>

    <ImageView
        android:id="@+id/share"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/share" />

    <ImageView
        android:id="@+id/save"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/save" />

    <ImageView
        android:id="@+id/set"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/set" />

    <ImageView
        android:id="@+id/fix"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/light" />

    <ImageView
        android:id="@+id/rotate"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/ic_menu_rotate" />

    <ImageView
        android:id="@+id/stock"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".14"
        android:background="@drawable/action_bar_left_button"
        android:src="@drawable/stock" />

</LinearLayout>

e poi nel tuo main_activity.xmle inserisci questo codice al suo interno: -

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity"
android:id="@+id/relt"
android:background="@drawable/background" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="78dp"
    android:id="@+id/down"
    android:layout_alignParentBottom="true" >

    <include
        android:layout_width="fill_parent"
        android:layout_height="78dp"
        layout="@layout/footer" >
    </include>
</LinearLayout>
<ImageView
    android:id="@+id/view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/down"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_below="@+id/inc"
   >  
    </ImageView> 
    <include layout="@layout/header"
        android:id="@+id/inc"
        android:layout_width="fill_parent"
        android:layout_height="50dp"></include> 

buona programmazione :)


L'ordine è importante? Ho notato che hai inserito il piè di pagina come primo elemento e l'intestazione come ultimo.
Martin Konecny,

@MartinKonecny ​​no, non importa perché RelativeLayout ha i suoi attributi in modo da poter controllare dove adattarsi ad altri layout al suo interno. come: layout_below, ecc.
k0sh

3

Puoi farlo prendendo un layout Frame come Layout principale e quindi inserendo un layout lineare al suo interno. Ecco un esempio:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
 >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:textSize="16sp"/>


<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"      
    android:textSize="16sp"
    />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:textSize="16sp"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
     android:textSize="16sp"/>




</LinearLayout>

<Button
    android:id="@+id/button2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:layout_gravity="bottom"
    />
 </FrameLayout>

3
<LinearLayout
 android:id="@+id/LinearLayouts02"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 android:gravity="bottom|end">

<TextView
android:id="@+id/texts1"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_weight="2"
android:text="@string/forgotpass"
android:padding="7dp"
android:gravity="bottom|center_horizontal"
android:paddingLeft="10dp"
android:layout_marginBottom="30dp"
android:bottomLeftRadius="10dp"
android:bottomRightRadius="50dp"
android:fontFamily="sans-serif-condensed"
android:textColor="@color/colorAccent"
android:textStyle="bold"
android:textSize="16sp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp"/>

</LinearLayout>

1

Aggiungi layout_weight = "1" a nel tuo linearLayout con pulsanti.

Modifica: - fammi semplificare

segui qualcosa come sotto, il nome dei tag potrebbe non essere corretto, è solo un'idea

<LL>// Top Parrent LinearLayout
   <LL1 height="fill_parent" weight="1" "other tags as requirement"> <TV /><Butons /></LL1> // this layout will fill your screen.
   <LL2 height="wrap_content" weight="1"  orientation="Horizontal" "other tags as requirement"> <BT1 /><BT2/ ></LL2> // this layout gonna take lower part of button height of your screen

<LL/> TOP PARENT CLOSED

aggiungendo anroid: layout_weight = "1" non sposta il layout lineare (e i pulsanti) verso il basso in basso ...
gioco

@AND_DEV, hai dimenticato di impostare Android: gravità. In questo momento, i pulsanti saranno ancora in alto, anche se il LinearLayout che li contiene riempie l'intera area inferiore.
Brian Attwell,

No, i pulsanti saranno in LL2 e saranno nella parte inferiore. Può impostare la gravità se OP desidera che il pulsante sia nella riga inferiore esatta. Stavo solo dando un'idea approssimativa, quindi può farlo secondo le sue esigenze.
AAnkit,

Ti leggo correttamente, che stai usando l' LL1elemento come distanziatore, quindi tutto il prossimo sarà in fondo? Trucco abbastanza pulito.
Greenoldman,

0

Aggiungi android:windowSoftInputMode="adjustPan"a manifest - all'attività corrispondente:

  <activity android:name="MyActivity"
    ...
    android:windowSoftInputMode="adjustPan"
    ...
  </activity>

0

Puoi raggruppare i tuoi pulsanti in un layout relativo anche se il layout principale è lineare. Assicurati che il genitore più esterno abbia android: l' attributo layout_height impostato su match_parent . E in quel tag Button aggiungi 'android: alignParentBottom = "True"'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.