วิธีสร้างเค้าโครงด้วย View เติมเต็มพื้นที่ที่เหลืออยู่?


188

ฉันกำลังออกแบบ UI แอปพลิเคชันของฉัน ฉันต้องการเลย์เอาต์ที่มีลักษณะดังนี้:

ตัวอย่างโครงร่างที่ต้องการ

(<และ> เป็นปุ่ม) ปัญหาคือฉันไม่ทราบวิธีการตรวจสอบให้แน่ใจว่า TextView จะเติมเต็มพื้นที่ที่เหลือด้วยปุ่มสองปุ่มที่มีขนาดคงที่

ถ้าฉันใช้ fill_parent สำหรับมุมมองข้อความปุ่มที่สอง (>) จะไม่สามารถแสดงได้

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


คุณใช้อะไรเป็นเค้าโครงของรูท
woodshy

1
@woodshy เค้าโครงใด ๆ ก็โอเคมันไม่สำคัญ
ลุค Vo

คำตอบ:


213

คำตอบจาก woodshy ทำงานสำหรับฉันและมันจะง่ายกว่าคำตอบโดย Ungureanu Liviu RelativeLayoutเพราะมันไม่ได้ใช้ ฉันให้เค้าโครงเพื่อความชัดเจน:

<LinearLayout 
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:orientation="horizontal"
      >

     <Button
        android:layout_width = "80dp"
        android:layout_weight = "0"
        android:layout_height = "wrap_content"
        android:text="&lt;"/>
     <TextView
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_weight = "1"/>
     <Button
        android:layout_width = "80dp"
        android:layout_weight = "0"
        android:layout_height = "wrap_content"
        android:text="&gt;"/>   
 </LinearLayout>

มี somethings ชอบalignLeftและalignParentLeftฯลฯ LinearLayoutซึ่งไม่สามารถทำได้ด้วย
IcyFlame

ฉันไม่เข้าใจอย่างเต็มที่ว่าจะเป็นไปได้อย่างไร แต่มันก็เป็นกลอุบายที่ยอดเยี่ยมจริงๆที่จะหลีกเลี่ยง RelativeLayout
a.dibacco

2
นี่เป็นคำตอบที่ยอมรับได้อย่างไร ไม่มีมุมมองรูปภาพเป็นเพียงส่วนหนึ่งของโซลูชัน อย่างน้อยมันก็ดีกว่าคำตอบที่ได้รับการโหวตสูงสุดด้วยเค้าโครงแบบสัมพัทธ์ (ฉันอธิบายว่าทำไมในคำตอบของฉัน)
Livio

ทางออกอัจฉริยะ
Mohammad Elsayed

92

ในกรณีที่วาง <TEXT VIEW> ใน LinearLayout ให้ตั้งค่า Layout_weight proprty เป็น <และ> เป็น 0 และ 1 สำหรับ TextView
ในกรณีที่ RelativeLayout จัดตำแหน่ง <และ> ไปทางซ้ายและขวาและตั้งค่า "เค้าโครงด้านซ้ายของ" และ "โครงร่างทางด้านขวาของ" คุณสมบัติของ TextView เป็นรหัสของ <และ>


ไม่มีใครยังต้องการตัวอย่างหรือไม่
woodshy

วิธีเพิ่มรูปภาพในเค้าโครงนี้เพื่อเติมเต็มมุมมองทั้งหมด
Tushar Pandey

คุณจะเพิ่มรูปภาพภายในเค้าโครงที่สัมพันธ์กันอย่างไรเพื่อเติมเต็มมุมมองทั้งหมด
Tushar Pandey

4
@woodshy ใช่ตัวอย่างยังจะเป็นประโยชน์
แฟรงก์ Schwieterman

ดูคำตอบของ Vivek Pandey สำหรับตัวอย่าง
MyDogTom

71

หากคุณใช้RelativeLayoutคุณสามารถทำสิ่งนี้:

<RelativeLayout
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent">
    <ImageView
        android:id = "@+id/my_image"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_alignParentTop ="true" />
    <RelativeLayout
        android:id="@+id/layout_bottom"
        android:layout_width="fill_parent"
        android:layout_height = "50dp"
        android:layout_alignParentBottom = "true">
        <Button
            android:id = "@+id/but_left"
            android:layout_width = "80dp"
            android:layout_height = "wrap_content"
            android:text="&lt;"
            android:layout_alignParentLeft = "true"/>
        <TextView
            android:layout_width = "fill_parent"
            android:layout_height = "wrap_content"
            android:layout_toLeftOf = "@+id/but_right"
            android:layout_toRightOf = "@id/but_left" />
        <Button
            android:id = "@id/but_right"
            android:layout_width = "80dp"
            android:layout_height = "wrap_content"
            android:text="&gt;"
            android:layout_alignParentRight = "true"/>
    </RelativeLayout>
</RelativeLayout>

ขอบคุณใช้งานได้ :) แต่ฉันไม่เข้าใจ ทำไม TextView ไม่เติมเต็มทุกพื้นที่ไม่ใช่สำหรับ>ปุ่ม?
ลุค Vo

2
เหตุใดจึงมีเค้าโครงที่สัมพันธ์กันสองรูปแบบ รากที่หนึ่งควรจะเพียงพอ จากนั้นสิ่งที่คุณต้องทำคือให้แน่ใจว่าลูก ๆ ของเค้าโครงที่สัมพันธ์กันด้านล่างทั้งหมด alignParentBottom = "true"
Noel

@Noel คุณพูดถูก ฉันเลือกเลย์เอาต์ 2 เพราะนี่คือวิธีที่ฉันใช้: ในแอปพลิเคชันของฉันมันสามารถเกิดขึ้นได้ที่ฉันต้องเปลี่ยนการมองเห็นของมุมมองไม่กี่มุมมองและมันง่ายกว่าที่จะวางพวกมันทั้งหมดไว้ในเลย์เอาต์ . ตัวอย่างของฉันไม่สมบูรณ์ แต่ใช้งานได้และอาจเป็นประโยชน์สำหรับใครบางคน
Ungureanu Liviu

1
@WN นี่เป็นสิ่งที่แปลกสำหรับฉันเช่นกัน :) ฉันคิดว่ามุมมองข้อความไม่ได้ใช้พื้นที่ทั้งหมดเพราะปุ่มขวามีความกว้างคงที่ หากคุณเปลี่ยน android: layout_width = "80dp" เป็น android: layout_width = "wrap_content" สำหรับปุ่มขวามันจะทำงาน
Ungureanu Liviu

2
คำตอบนี้ไม่ดีจริงๆ! คุณควรหลีกเลี่ยงการซ้อน 2 เค้าโครงที่สัมพันธ์กันเนื่องจากเค้าโครงที่สัมพันธ์ทำ 2 ผ่านเสมอสำหรับการวาด (เทียบกับ 1 สำหรับเค้าโครงอื่น ๆ ) มันจะกลายเป็นเลขชี้กำลังเมื่อคุณซ้อนมัน คุณควรใช้การจัดวางเชิงเส้นที่มีความกว้าง = 0 และน้ำหนัก = 1 ในองค์ประกอบที่คุณต้องการเติมพื้นที่ว่าง เตือนความจำ: ใช้เลย์เอาต์ที่เกี่ยวข้องเท่านั้นเมื่อคุณไม่มีตัวเลือกอื่น stackoverflow.com/questions/4069037/…
Livio

30

ใช้ConstraintLayoutฉันได้พบสิ่งที่ต้องการ

<Button
    android:id="@+id/left_button"
    android:layout_width="80dp"
    android:layout_height="48dp"
    android:text="&lt;"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toRightOf="@+id/left_button"
    app:layout_constraintRight_toLeftOf="@+id/right_button"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/right_button"
    android:layout_width="80dp"
    android:layout_height="48dp"
    android:text="&gt;"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

โรงงาน กุญแจสำคัญคือการตั้งค่าข้อ จำกัด ด้านขวาซ้ายด้านบนและด้านล่างอย่างเหมาะสมจากนั้นตั้งค่าความกว้างและความสูงเป็น0dpและปล่อยให้มันหาขนาดของตัวเอง


4
เพิ่งเริ่มใช้ ConstraintLayout มันยอดเยี่ยมที่ได้รู้ว่าสามารถกำหนดความกว้างและความสูงตามข้อ จำกัด เมื่อตั้งค่าเป็น "0", Thanx สำหรับเรื่องนั้น :)
MQoder

สิ่งสำคัญที่ควรระวังเกี่ยวกับทิศทางของลูกศรของแต่ละข้อ จำกัด ตรวจสอบให้แน่ใจว่าTextViewมีข้อ จำกัด ด้านซ้ายและขวา TextViewไม่ยืดถ้าครั้งแรกButtonมีข้อ จำกัด สิทธิที่จะTextViewและที่ผ่านมาButtonมีข้อ จำกัด TextViewทางด้านซ้ายไป
Manuel

ดีกว่ามาก! ปรับปรุงประสิทธิภาพโดยไม่ต้องมีเค้าโครงที่ซ้อนกัน ขอบคุณที่เตือนเราถึงเคล็ดลับ
0dp

7

มันง่ายคุณตั้งค่า minWidth หรือ minHeight ขึ้นอยู่กับสิ่งที่คุณกำลังมองหาแนวนอนหรือแนวตั้ง และสำหรับวัตถุอื่น (อันที่คุณต้องการเติมพื้นที่ที่เหลือ) คุณตั้งค่าน้ำหนัก 1 (ตั้งค่าความกว้างเพื่อตัดเนื้อหาของมัน) ดังนั้นมันจะเติมส่วนที่เหลือของพื้นที่

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center|left"
        android:orientation="vertical" >
</LinearLayout>
<LinearLayout
        android:layout_width="80dp"
        android:layout_height="fill_parent"
        android:minWidth="80dp" >
</LinearLayout>

4

คุณสามารถใช้แอตทริบิวต์ layout_weight สูง ด้านล่างคุณสามารถดูเค้าโครงที่ ListView ใช้พื้นที่ว่างทั้งหมดพร้อมปุ่มที่ด้านล่าง:

<LinearLayout 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"
    tools:context=".ConfigurationActivity"
    android:orientation="vertical"
    >

        <ListView
            android:id="@+id/listView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1000"
            />


        <Button
            android:id="@+id/btnCreateNewRule"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Create New Rule" />



        <Button
            android:id="@+id/btnConfigureOk"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Ok" />


</LinearLayout>

3

สำหรับผู้ที่มีความผิดพลาดเดียวกันกับ<LinearLayout...>ฉัน:

มันเป็นสิ่งสำคัญที่จะระบุก็จะไม่ทำงานกับandroid:layout_width="fill_parent"wrap_content

OTOH คุณอาจandroid:layout_weight = "0"ไม่ต้องทำอะไรเลย

รหัสของฉันนั้นเหมือนกับรหัสในhttps://stackoverflow.com/a/25781167/755804 (โดย Vivek Pandey)


3

คุณควรหลีกเลี่ยงการซ้อน 2 เค้าโครงที่สัมพันธ์กันเนื่องจากเค้าโครงที่สัมพันธ์ทำ 2 ผ่านเสมอสำหรับการวาด (เทียบกับ 1 สำหรับเค้าโครงอื่น ๆ ) มันจะกลายเป็นเลขชี้กำลังเมื่อคุณซ้อนมัน คุณควรใช้การจัดวางเชิงเส้นที่มีความกว้าง = 0 และน้ำหนัก = 1 ในองค์ประกอบที่คุณต้องการเติมพื้นที่ว่าง คำตอบนี้ดีกว่าสำหรับประสิทธิภาพและการปฏิบัติ เตือนความจำ: ใช้เลย์เอาต์ที่เกี่ยวข้องเท่านั้นเมื่อคุณไม่มีตัวเลือกอื่น

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

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/prev_button"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:text="&lt;" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ellipsize="end"
            android:singleLine="true"
            android:gravity="center"
            android:text="TextView" />

        <Button
            android:id="@+id/next_button"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:text="&gt;" />
    </LinearLayout>
</LinearLayout>

0

คุณสามารถใช้การตั้งค่าlayout_widthหรือlayout_widthเพื่อ0dp(โดยการวางแนวที่คุณต้องการเติมพื้นที่ที่เหลือ) จากนั้นใช้ปุ่มlayout_weightเพื่อทำให้เต็มพื้นที่ที่เหลือ


0

ใช้ Relativelayout เพื่อตัด LinearLayout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:round="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
    <Button
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text="&lt;"/>
    <TextView
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_weight = "1"/>
    <Button
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text="&gt;"/>

</LinearLayout>

</RelativeLayout>`

0

ฉันพบ

 <TextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginEnd="10dp"
        android:fontFamily="casual"
        android:text="(By Zeus B0t)"
     ``   android:textSize="10sp"
        android:gravity="bottom"
        android:textStyle="italic" />

0

เมื่อใช้เค้าโครงที่สัมพันธ์กันคุณสามารถสร้างมุมมองยืดโดยยึดกับมุมมองทั้งสองที่ควรขยายไป แม้ว่าความสูงที่ระบุจะถูกเพิกเฉย แต่ Android ยังคงต้องการแอตทริบิวต์ความสูงซึ่งเป็นสาเหตุที่ฉันเขียนว่า "0dp" ตัวอย่าง:

<View
    android:id="@+id/topView"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_alignParentTop="true"
    android:layout_marginTop="8dp"/>

<View
    android:id="@+id/stretchableView"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_below="@id/topView"
    android:layout_above="@+id/bottomView"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"
    android:adjustViewBounds="true"/>

<View
    android:id="@id/bottomView"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="16dp"/>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.