วางปุ่มที่ด้านล่างของหน้าจอด้วย LinearLayout?


139

ฉันมีรหัสต่อไปนี้ฉันจะสร้างมันได้อย่างไรเพื่อให้ปุ่ม 3 ปุ่มอยู่ที่ด้านล่าง

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


มุมมองนี้มีอะไรบ้าง? เค้าโครงกรอบ? เค้าโครงญาติ?
Nirvana Tikku

1
รหัสของคุณมีการพิมพ์ผิด โดยคุณอาจหมายถึงandroid:weight="1" android:layout_weight="1"นี่ไม่ใช่ปัญหาของคุณ
Brian Attwell


การใช้เค้าโครงพื้นที่ที่พบในกล่องเครื่องมืออาจง่ายกว่า คุณสามารถวางไว้ที่ด้านบนของเค้าโครงที่มีอยู่เหนือปุ่มและปรับขนาดแล้วมันจะดันไปที่ด้านล่าง
Alex

คำตอบ:


273

คุณต้องมั่นใจสี่ประการ:

  • ภายนอกของคุณLinearLayoutมีlayout_height="match_parent"
  • ภายในของคุณLinearLayoutมีlayout_weight="1"และlayout_height="0dp"
  • ของคุณTextViewมีlayout_weight="0"
  • คุณตั้งค่าแรงโน้มถ่วงที่ด้านในของคุณอย่างเหมาะสมแล้ว LinearLayout: android:gravity="center|bottom"

ข้อสังเกตfill_parentว่าไม่ได้หมายความว่า "ใช้พื้นที่ว่างทั้งหมด" อย่างไรก็ตามหากคุณใช้layout_height="0dp"ด้วยlayout_weight="1"มุมมองจะใช้พื้นที่ว่างทั้งหมด ( ไม่สามารถรับเลย์เอาต์ที่เหมาะสมด้วย "fill_parent" )

นี่คือโค้ดบางส่วนที่ฉันเขียนขึ้นอย่างรวดเร็วโดยใช้ LinearLayouts สองแบบในลักษณะที่คล้ายคลึงกับโค้ดของคุณ

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

ผลลัพธ์จะคล้ายกับสิ่งนี้:

ป้อนคำอธิบายภาพที่นี่


โหวตเพื่อรับทราบวิธีรับมุมมองเพื่อเติมเต็มพื้นที่ว่างทั้งหมด! ขอบคุณคำตอบที่ดี!
ลิซ่า

คำเตือนผ้าสำลี ... !
Yousha Aleayoub

นี่ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุดเพราะหลังจากนั้นคุณไม่สามารถตั้งค่ามุมมองที่กึ่งกลางของหน้าจอที่เหลือ ......................... รางวัลทางออกที่ดีที่สุดจึงตกเป็นของสิ่งนี้ ตอบ - stackoverflow.com/a/26140793/4741746
sushant gosavi

คุณช่วยอธิบายความสำคัญlayout_weight="0"หรือสิ่งที่เป็นจริงได้ไหม
Rahat Zaman

24

คุณสามารถใช้RelativeLayoutและจัดแนวให้ชิดด้านล่างด้วยandroid:layout_alignParentBottom="true"


1
เป็นไปไม่ได้โดยใช้เลย์เอาต์เชิงเส้น?
thedeepfield

มันคือ. เช่นเดียวกับ @AND_DEV แล้วกล่าวว่า: layout_weight="1"การใช้งาน ด้วยสิ่งนี้ LinearLayout ของคุณจะใช้ความสูงที่เหลือบนหน้าจอ ตอนนี้คุณสามารถตั้งค่าแรงโน้มถ่วงของปุ่มของคุณไปที่ด้านล่าง
Ahmad

1
การเลย์เอาต์แบบสัมพัทธ์นั้นอ่านยากแทบไม่เคยทำในสิ่งที่คุณต้องการและโดยทั่วไปแล้วการรักษานั้นแย่ ฉันจะใช้การแสดง 30 linearlayouts มากกว่า 1 แบบสัมพัทธ์ทุกวันในสัปดาห์เพียงเพราะมันช่วยประหยัดเวลาเล่นซอ
G_V

@ Ahmed ฉันคิดว่าคำถามที่ถามนั้นชัดเจนมากสำหรับ LinearLayout แต่ตอบสำหรับ RelativityLayout และ Brian Attwell ตอบอย่างชัดเจนด้วย android: แรงโน้มถ่วง = "center | bottom"!
Gopi.cs

@ Gopi.cs ฉันไม่แน่ใจจริงๆว่าทำไมคุณถึงแสดงความคิดเห็นกับคำตอบที่ฉันให้ไว้เมื่อกว่า 6 (!) ปีที่แล้ว เป็นปี 2019 เพียงใช้ ConstraintLayout
Ahmad

13

สร้างเลย์เอาต์แบบสัมพัทธ์และภายในเลย์เอาต์นั้นสร้างปุ่มของคุณด้วยบรรทัดนี้

android:layout_alignParentBottom="true"

2
นอกจากนี้การเพิ่มandroid:layout_centerHorizontal="true"ให้อยู่กึ่งกลางในแนวนอนทำให้วิธีนี้เป็นทางออกที่ยอดเยี่ยม
Thomas Mondel

1
เคล็ดลับที่ยอดเยี่ยม ขอบคุณ
zackygaurav

4

ก่อนอื่นให้สร้างชื่อไฟล์ตามที่footer.xml ใส่รหัสนี้ไว้ข้างใน

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

จากนั้นสร้างheader.xmlและใส่รหัสนี้ไว้ข้างใน:

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

จากนั้นในของคุณmain_activity.xmlและใส่รหัสนี้ไว้ข้างใน: -

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

มีความสุขในการเขียนโค้ด :)


คำสั่งซื้อมีความสำคัญหรือไม่? ฉันสังเกตเห็นว่าคุณใส่ส่วนท้ายเป็นองค์ประกอบแรกและส่วนหัวเป็นตัวสุดท้าย
Martin Konecny

@MartinKonecny ​​ไม่เป็นไรเพราะ RelativeLayout มีแอตทริบิวต์ของตัวเองดังนั้นคุณสามารถควบคุมได้ว่าจะให้เค้าโครงอื่น ๆ อยู่ที่ใด like: layout_below เป็นต้น
k0sh

3

คุณสามารถทำได้โดยใช้เค้าโครงเฟรมเป็นเค้าโครงหลักจากนั้นใส่เค้าโครงเชิงเส้นไว้ข้างใน นี่คือตัวอย่าง:

<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

เพียงแค่เพิ่ม layout_weight = "1" ใน linearLayout ที่มีปุ่ม

แก้ไข: -ขอฉันทำให้มันง่าย

ตามด้านล่างนี้ชื่อแท็กอาจไม่ถูกต้องเป็นเพียงไอเดีย

<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

การเพิ่ม anroid: layout_weight = "1" จะไม่ย้ายเค้าโครงเชิงเส้น (และปุ่ม) ลงไปด้านล่าง ...
thedeepfield

@AND_DEV คุณลืมตั้งค่า android: แรงโน้มถ่วง ตอนนี้ปุ่มต่างๆจะยังคงอยู่ที่ด้านบนแม้ว่า LinearLayout ที่มีอยู่จะเต็มพื้นที่ด้านล่างทั้งหมด
Brian Attwell

ไม่ปุ่มจะอยู่ใน LL2 และจะอยู่บริเวณด้านล่าง สามารถตั้งค่า Gravity ได้หาก OP ต้องการปุ่มในบรรทัดล่างสุดที่แน่นอน ฉันแค่ให้ไอเดียคร่าวๆเพื่อให้เขาทำตามความต้องการของเขา
AAnkit

ฉันอ่านคุณถูกต้องLL1หรือเปล่าว่าคุณใช้องค์ประกอบเป็นตัวเว้นวรรคดังนั้นทุกอย่างถัดไปจะอยู่ที่ด้านล่าง เคล็ดลับสวย ๆ
greenoldman

1

คุณสามารถรวมปุ่มของคุณไว้ใน RelativeLayoutได้แม้ว่าเค้าโครงหลักของคุณจะเป็น Linear ก็ตาม ให้แน่ใจว่าด้านนอกผู้ปกครองส่วนใหญ่มีหุ่นยนต์: layout_heightชุดแอตทริบิวต์match_parent และในแท็กปุ่มนั้นให้เพิ่ม 'android: alignParentBottom = "True"'


0

เพิ่มandroid:windowSoftInputMode="adjustPan"ในรายการ - ในกิจกรรมที่เกี่ยวข้อง:

  <activity android:name="MyActivity"
    ...
    android:windowSoftInputMode="adjustPan"
    ...
  </activity>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.