ตั้งค่าความกว้างให้ตรงกับข้อ จำกัด ใน ConstraintLayout


98

ฉันต้องการ จำกัด มุมมองด้านซ้ายและด้านขวาให้เท่ากับระยะขอบของมุมมองหลักและทำให้เต็มพื้นที่ที่กำหนด อย่างไรก็ตามการตั้งค่าความกว้างเป็นอย่างใดอย่างหนึ่งmatch_parentหรือwrap_contentดูเหมือนจะให้ผลลัพธ์เดียวกัน

มีสิ่งที่เทียบเท่ากับ match_constraints (ตรงข้ามกับ match_parent และ wrap_content) หรือไม่ ทำmatch_parentและwrap_contentส่งผลกระทบต่อเค้าโครงหรือถูกละเว้นในเค้าโครงข้อ จำกัด ใหม่หรือไม่

ชอบระบบเลย์เอาต์ใหม่สำหรับแพลตฟอร์มโปรดของฉัน!


1
ทำไมmatch_parentไม่ได้ผลสำหรับคุณ?
Eugen Martynov

คำตอบ:


126

match_parentไม่รองรับ ด้วย0dpคุณสามารถคิดว่าข้อ จำกัด ของคุณเป็นแบบ "ปรับขนาดได้" แทนที่จะเป็น "เติมสิ่งที่เหลือ"

นอกจากนี้ยัง0dpสามารถกำหนดโดยตำแหน่งซึ่งmatch_parentขึ้นอยู่กับระดับบนสุดของตำแหน่ง (x, y และความกว้าง, ความสูง)


31
ทำไมถึงได้รับคำตอบนี้!? การจัดวางข้อ จำกัด ไม่รองรับ match_parent และคำตอบนี้ไม่มีทางนำไปใช้ได้
Daniele Segato

3
ไม่รองรับ match_parent
Nicolas Roard

7
คำตอบนี้ถูกต้อง ระบุชัดเจนว่าไม่รองรับ match_parent นอกจากนี้ในการดำเนินการทางเลือกที่เหมาะสมสำหรับการตั้งค่า "match_parent" 0dp ที่มีข้อ จำกัด ที่ตั้งค่าเป็นพาเรนต์ทางซ้ายและขวา (ระยะขอบ 0 หรือเลือกให้เหมาะสม) จะให้ผลลัพธ์เดียวกัน สิ่งเดียวที่เหลืออยู่ในคำตอบนี้ซึ่งอยู่ในคำตอบของ Arieck คือความจำเป็นในการกำหนดข้อ จำกัด ทั้งสองด้าน (หรือด้านบนและด้านล่างสำหรับแนวตั้ง) นี่คือวิธีที่ฉันทำและฉันไม่มีปัญหาใด ๆ นอกจากนี้ยังทำงานเป็นการตั้งค่าน้ำหนักเมื่อใช้กับส่วนประกอบอื่น ๆ
Eric Engel

หากมีคนมาที่นี่เพื่อค้นหาคำตอบว่ามันไม่ได้ผล ดูเหมือนว่าจะเสียในเบต้า ดูเหมือนว่าจะทำงานใน 1.0.2 บทเรียนที่เรียนรู้ - ตรึงห้องสมุดอย่าใช้การอัปเดตที่ฉวยโอกาส
จำนวนเต็ม

1
@Tequilaman ความคิดเห็นสามารถเป็นคำตอบ เขาได้ชี้ให้เห็นถึงแนวทางในการนำไปปฏิบัติอย่างถูกต้อง สร้างข้อ จำกัด ทั้งสองด้านด้วยระยะขอบ 0dp มันทำเคล็ดลับ
Utkarsh Mankad

170

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

ตัวอย่างเช่นหากคุณต้องการให้มีmatch_parentข้อ จำกัด เกี่ยวกับความกว้างขององค์ประกอบคุณสามารถทำได้ดังนี้:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

4
ทีม Android ควรทำให้ "match_parent" ทำงานได้ มันจะง่ายมาก เพียงแค่ทำให้ match_parent มีฟังก์ชันเดียวกับที่แอปถูก จำกัด ให้เริ่มต้นและสิ้นสุดของผู้ปกครอง จะตรวจจับได้ง่ายในแนวตั้งหรือแนวนอน
bharv14

แต่ 0dp ไม่ส่งผลให้มีการวัดสองครั้งหรือไม่?
Pramod Garg

25

เห็นได้ชัดว่าmatch_parent:

  • ไม่ตกลงสำหรับมุมมองโดยตรงภายใต้ConstraintLayout
  • ตกลงสำหรับมุมมองที่ซ้อนอยู่ภายในมุมมองที่อยู่ภายใต้โดยตรงConstraintLayout

ดังนั้นหากคุณต้องการให้มุมมองของคุณทำงานเป็นmatch_parent:

  1. เด็กโดยตรงของConstraintLayoutควรใช้0dp
  2. องค์ประกอบที่ซ้อนกัน (เช่นหลานถึง ConstraintLayout)สามารถใช้ได้match_parent

ตัวอย่าง:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="16dp">

    <android.support.design.widget.TextInputLayout
        android:id="@+id/phoneNumberInputLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/phoneNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </android.support.design.widget.TextInputLayout>

สิ่งที่เกี่ยวกับ ConstraintLayout ที่ซ้อนอยู่ใน ConstraintLayout ในตัวอย่างของคุณเปลี่ยน TextInputLayout เป็น ConstraintLayout?
superuser

16

match_parentConstraintLayoutไม่ได้รับการสนับสนุนโดย ตั้งค่าความกว้างเพื่อ0dpให้ตรงกับข้อ จำกัด


และ wrap_content ได้รับการสนับสนุนหรือไม่
KG6ZVP

ใช่เท่าที่ฉันสามารถบอกได้
Marcin Koziński

6
wrap_content ได้รับการสนับสนุน
Romain Guy

13

จากเอกสารอย่างเป็นทางการ :

สำคัญ: ไม่แนะนำให้ใช้ MATCH_PARENT สำหรับวิดเจ็ตที่อยู่ใน ConstraintLayout พฤติกรรมที่คล้ายกันสามารถกำหนดได้โดยใช้ MATCH_CONSTRAINT โดยกำหนดข้อ จำกัด ด้านซ้าย / ขวาหรือบน / ล่างเป็น "parent"

ดังนั้นหากคุณต้องการบรรลุMATCH_PARENTผลคุณสามารถทำได้:

<TextView
    android:id="@+id/textView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="TextView"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

4

คุณสามารถตรวจสอบอะแดปเตอร์ของคุณ

 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
 2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

ฉันมีปัญหาเดียวกันกับคุณเมื่อฉันใช้ 1 คุณสามารถลอง 2.


นี่มันทอง! ขอบคุณ!
grrigore

3

ในการทำให้มุมมองของคุณเป็น match_parent ไม่สามารถทำได้โดยตรง แต่เราสามารถทำได้ในวิธีที่แตกต่างกันเล็กน้อย แต่อย่าลืมใช้แอตทริบิวต์ Left และ Right กับ Start และ End เพราะหากคุณใช้การสนับสนุน RTL จำเป็นต้องมี

    <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

2

ตั้งค่าความกว้างหรือความสูง (สิ่งที่คุณต้องจับคู่แม่) เป็น 0dp และตั้งค่าระยะขอบซ้ายขวาบนล่างเพื่อทำหน้าที่เป็นผู้ปกครองที่ตรงกัน


1

ในเอกสารสำนักงาน: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

เมื่อตั้งค่ามิติข้อมูลเป็น MATCH_CONSTRAINT ลักษณะการทำงานเริ่มต้นคือให้ขนาดผลลัพธ์ใช้พื้นที่ว่างทั้งหมด

ใช้ 0dp ซึ่งเทียบเท่ากับ "MATCH_CONSTRAINT"

สำคัญ: ไม่แนะนำให้ใช้ MATCH_PARENT สำหรับวิดเจ็ตที่อยู่ใน ConstraintLayout พฤติกรรมที่คล้ายกันสามารถกำหนดได้โดยใช้ MATCH_CONSTRAINT โดยกำหนดข้อ จำกัด ด้านซ้าย / ขวาหรือบน / ล่างเป็น "parent"


0

หากคุณต้องการให้ TextView อยู่ตรงกลางของพาเรนต์ ..
เลย์เอาต์หลักของคุณคือ Constraint Layout

<androidx.appcompat.widget.AppCompatTextView
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:text="@string/logout"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     android:gravity="center">
</androidx.appcompat.widget.AppCompatTextView>

0

ฉันพบอีกหนึ่งคำตอบเมื่อมีเลย์เอาต์ข้อ จำกัด ในมุมมองเลื่อนเราต้องใส่

android:fillViewport="true"

ไปยังมุมมองแบบเลื่อน

และ

android:layout_height="0dp"

ในเค้าโครงข้อ จำกัด

ตัวอย่าง:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp">

// Rest of the views

</androidx.constraintlayout.widget.ConstraintLayout>

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