Letakkan tombol di bagian bawah layar dengan LinearLayout?

136

Saya memiliki kode berikut, bagaimana cara membuatnya sehingga 3 tombol di bagian bawah?

    <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>

medan itu
sumber
apa pandangan ini dibungkus? tata letak bingkai? tata letak relatif?
Nirvana Tikku
1
Kode Anda mengandung salah ketik. Dengan android:weight="1"Anda mungkin berarti android:layout_weight="1". Ini bukan masalahmu.
Brian Attwell
2
kemungkinan duplikat dari Bagaimana menyelaraskan tampilan di bagian bawah layar?
Krupa Patel
Mungkin lebih mudah menggunakan tata ruang yang ditemukan di kotak alat. Anda dapat menempatkannya di atas tata letak yang ada di atas tombol dan ukurannya dan itu akan mendorongnya ke bawah.
Alex

Jawaban:

268

Anda perlu memastikan empat hal:

  • Luar Anda LinearLayoutmemilikilayout_height="match_parent"
  • Bagian dalam Anda LinearLayoutmemiliki layout_weight="1"danlayout_height="0dp"
  • Anda TextViewpunyalayout_weight="0"
  • Anda telah mengatur gravitasi dengan benar di batin Anda LinearLayout: android:gravity="center|bottom"

Perhatikan itu fill_parenttidak berarti "mengambil semua ruang yang tersedia". Namun, jika Anda menggunakan layout_height="0dp"dengan layout_weight="1", maka tampilan akan memakan semua ruang yang tersedia ( Tidak bisa mendapatkan tata letak yang tepat dengan "fill_parent" ).

Berikut adalah beberapa kode yang saya tulis dengan cepat yang menggunakan dua LinearLayouts dengan cara yang mirip dengan kode Anda.

<?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>

Hasilnya mirip dengan ini:

masukkan deskripsi gambar di sini

Brian Attwell
sumber
Dipilih hanya untuk catatan tentang cara mendapatkan tampilan untuk mengisi semua ruang yang tersedia! Terima kasih, jawaban yang bagus!
lisa
Peringatan Lint itu ...!
Yousha Aleayoub
Ini bukan solusi terbaik karena setelah itu Anda tidak dapat mengatur tampilan di tengah layar yang tersisa ......................... jadi penghargaan solusi terbaik berlaku untuk ini answer - stackoverflow.com/a/26140793/4741746
sushant gosavi
Bisakah Anda jelaskan pentingnya layout_weight="0"atau apa fungsinya?
Rahat Zaman
23

Anda dapat menggunakan RelativeLayoutdan menyelaraskannya ke bawahandroid:layout_alignParentBottom="true"

Ahmad
sumber
1
Apakah tidak mungkin menggunakan tata letak linier?
thedeepfield
Ini. Seperti @AND_DEV sudah katakan: Gunakan layout_weight="1". Dengan ini LinearLayout Anda akan menempati ketinggian yang tersisa di layar; sekarang Anda dapat mengatur gravitasi Tombol Anda ke bawah.
Ahmad
1
Relativelayout sulit dibaca, hampir tidak pernah melakukan apa yang Anda inginkan dan umumnya buruk untuk dipertahankan. Saya akan mencapai performa 30 linearlayout lebih dari 1 relativelayout setiap hari dalam seminggu, hanya karena menghemat berjam-jam mengutak-atik frustasi.
G_V
@Ahmed saya pikir pertanyaan yang diajukan sangat jelas seperti untuk LinearLayout, Tetapi dijawab untuk RelativityLayout dan Brian Attwell menjawab dengan jelas dengan android: gravity = "center | bottom"!
Gopi.cs
@ Gopi.cs Saya benar-benar tidak yakin mengapa Anda mengomentari jawaban yang saya berikan lebih dari 6 (!) Tahun lalu. Ini tahun 2019, cukup gunakan ConstraintLayout.
Ahmad
12

Buat tata letak Relatif dan di dalam tata letak itu buat tombol Anda dengan baris ini

android:layout_alignParentBottom="true"
varghesekutty
sumber
2
Selain itu menambahkan android:layout_centerHorizontal="true"juga pusat secara horizontal membuat ini solusi yang bagus.
Thomas Mondel
1
Trik Hebat. Terima kasih
zackygaurav
4

pertama buat nama file sebagai footer.xml taruh kode ini di dalamnya.

<?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>  

lalu buat header.xml dan masukkan kode ini di dalamnya .:

<?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>

dan kemudian di Anda main_activity.xmldan letakkan kode ini di dalamnya: -

<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> 

selamat coding :)

k0sh
sumber
Apakah pesanan itu penting? Saya perhatikan Anda meletakkan footer sebagai elemen pertama, dan header sebagai yang terakhir.
Martin Konecny
@ MartinKonecny, tidak masalah karena RelativeLayout memiliki atributnya sendiri sehingga Anda dapat mengontrol di mana letak tata letak lain yang cocok di dalamnya. seperti: layout_below, dll.
k0sh
3

Anda dapat melakukan ini dengan mengambil Layout bingkai sebagai Layout induk dan kemudian meletakkan layout linear di dalamnya. Berikut ini sebuah contoh:

<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>
Diya Bhat
sumber
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>
Syed Danish Haider
sumber
1

Cukup tambahkan layout_weight = "1" ke dalam linearLayout Anda yang memiliki Tombol.

Sunting: - izinkan saya membuatnya sederhana

ikuti sesuatu seperti di bawah ini, nama tag mungkin tidak benar, itu hanya sebuah Ide

<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
AAnkit
sumber
menambahkan anroid: layout_weight = "1" tidak memindahkan tata letak linier (dan tombol) ke bawah ...
thedeepfield
@AND_DEV, Anda lupa mengatur android: gravitasi. Saat ini, tombol-tombolnya masih ada di atas, meskipun LinearLayout yang berisi tombol-tombol itu mengisi seluruh area bawah.
Brian Attwell
Tidak, Tombol akan berada di LL2 dan itu akan berada di bagian bawah. Dapat mengatur Gravity jika OP ingin Button di garis bawah yang tepat. Saya hanya memberikan Ide kasar, sehingga dia bisa melakukannya sesuai dengan kebutuhannya.
AAnkit
Apakah saya membaca Anda dengan benar, bahwa Anda menggunakan LL1elemen sebagai pengatur jarak, jadi semuanya berikutnya akan berada di bawah? Trik yang cukup rapi.
greenoldman
0

Tambahkan android:windowSoftInputMode="adjustPan"ke manifes - ke aktivitas yang sesuai:

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

Anda dapat menggabungkan Tombol Anda dalam RelativeLayout bahkan jika Layout Induk Anda adalah Linear. Pastikan orang tua paling luar memiliki atribut android: layout_height diatur ke match_parent . Dan dalam tag Button itu tambahkan 'android: alignParentBottom = "True"'

vidit pandey
sumber