match_parent และ fill_parent ต่างกันอย่างไร


1400

ฉันเล็ก ๆ น้อย ๆ สับสนเกี่ยวกับสองคุณสมบัติ XML: และmatch_parent fill_parentดูเหมือนว่าทั้งสองจะเหมือนกัน มีความแตกต่างระหว่างพวกเขาหรือไม่?


ถ้าคุณรู้สึกฟรีdeveloper.android.com/reference/android/view/…
Shomu

คำตอบ:


1235

พวกมันเหมือนกัน (ใน API ระดับ 8+) match_parentใช้

FILL_PARENT (เปลี่ยนชื่อเป็น MATCH_PARENT ใน API ระดับ 8 ขึ้นไป) ซึ่งหมายความว่ามุมมองต้องการมีขนาดใหญ่เท่ากับพาเรนต์ (ลบด้วยการเติมเต็ม)

...

fill_parent: มุมมองควรมีขนาดใหญ่เท่ากับพาเรนต์ (ลบด้วยการเติมเต็ม) อย่างต่อเนื่องนี้จะเลิกเริ่มต้นจากระดับ API 8 match_parentและจะถูกแทนที่ด้วย

http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html


5
ถ้าฉันเขียนแอพทั้ง 1.6 และ 2.2 ฉันจะใช้ fill_parent สำหรับความเข้ากันได้ใช่ไหม?
emeraldhieu

12
จะต้องมีความแตกต่างบางอย่างใช่มั้ย มิฉะนั้นทำไม Google เลิกใช้แล้วเปลี่ยนชื่อใหม่?
stickedoverflow

49
@Halim ไม่มีมีไม่มีความแตกต่างกัน : -1ทั้งสองจะถูกกำหนดเป็นค่าคงที่ ฉันรู้สึกดีขึ้นเกี่ยวกับเรื่องนี้ฉันไม่ได้รับความไม่พอใจในสิ่งนั้น ... :-)
arpy

2
@ jlovison ไม่ไม่มีความแตกต่าง -1ทั้งสองเป็น คุณได้รับข้อผิดพลาดเนื่องจากแพลตฟอร์มเก่าไม่ทราบชื่อใหม่ของค่าคงที่เดียวกันมาก
Tapirboy

16
มันแปลกมากที่ Android Studio ยังคงวาง "fill_parent" ไว้ในเลย์เอาท์เริ่มต้นทั้งหมดที่สร้างขึ้น! ฉันรู้ว่าพวกเขาเหมือนกัน แต่ฉันกลับมาที่คำถาม SO นี้ทุกปีเพื่อให้แน่ใจว่าไม่มีใครค้นพบว่ามีความแตกต่างจริง ๆ ทีมงาน Google / Android สามารถเปลี่ยนค่าเริ่มต้นจาก "fill_parent" เป็น "match_parent" ได้หรือไม่ ขอบคุณล่วงหน้า! :)
swooby

246

Google เปลี่ยนชื่อเพื่อหลีกเลี่ยงความสับสน

ปัญหาเกี่ยวกับชื่อเก่าfill parentคือมันบ่งบอกถึงผลกระทบต่อมิติของผู้ปกครองในขณะmatch parentที่อธิบายพฤติกรรมที่เกิดขึ้นได้ดีกว่า - จับคู่มิติกับผู้ปกครอง

ค่าคงที่ทั้งสองค่าคงที่-1ในที่สุดและส่งผลให้เกิดพฤติกรรมที่เหมือนกันในแอป กระแทกแดกดันพอเปลี่ยนชื่อนี้ทำให้ชัดเจนสิ่งต่าง ๆ ดูเหมือนจะเพิ่มความสับสนมากกว่าการกำจัด


17
... ยกเว้นลูกของ RelativeLayout ที่มี width = match_parent และพูดอีกครั้งให้เหลืออีก มันไม่ตรงกับมิติของผู้ปกครองมันเติมสิ่งที่เหลืออยู่ในนั้น ที่ให้บริการเท่านั้นที่จะทำให้เกิดความสับสน
kaay

7
ในฐานะที่เป็น FILL_PARENT และ MATCH_PARENT หมายความว่ามุมมองต้องการที่จะเป็นใหญ่เป็นผู้ปกครองของมันลบด้วยช่องว่างภายในของผู้ปกครองไม่ได้เป็นพื้นที่ภายในมากกว่ามิติด้านนอก? ตอนนี้ฉันยิ่งสับสนมากขึ้น!
Caltor

@bnieland ฉันได้ลบการอ้างอิงไปยังมิติด้านในและด้านนอกเนื่องจากไม่เห็นด้วยกับเอกสารของ Google ที่developer.android.com/reference/android/view/ ......แม้ว่าฉันจะเห็นข้อความที่คล้ายกัน (ไม่มีเงื่อนไข) ที่sevennet.org / 2014/11/22 / …ซึ่งเป็นที่ที่คุณอาจได้รับข้อมูลของคุณจาก
Caltor

28

ฟังก์ชั่นไม่แตกต่าง Google เพิ่งเปลี่ยนชื่อจาก fill_parent เป็น match_parent จาก API ระดับ 8 (Android 2.2) FILL_PARENT ยังคงพร้อมใช้งานสำหรับเหตุผลความเข้ากันได้

LayoutParams.FILL_PARENTและLayoutParams.MATCH_PARENTทั้งคู่มีค่า -1 ไม่แน่ใจว่าสิ่งที่ google ต้องการเปลี่ยนจาก Fill Parent เป็น Match parent :)

เนื่องจากphones are >= Android 2.2.. ส่วนใหญ่คุณควรใช้ Match Parent สำหรับความเข้ากันได้ในอนาคต ... ไม่แน่ใจว่าเมื่อใดพวกเขาจะหยุดค่าคงที่ Fill Parent เก่ากว่า!


11

เพื่อประโยชน์ในการใช้งานร่วมกันควรติดกับ fill_parent เช่นเมื่อสนับสนุนอุปกรณ์ API 8 ด้านล่าง แต่หากแอปของคุณกำหนดเป้าหมาย API 8 ขึ้นไปคุณควรใช้ match_parent แทน


8
เข้ากันได้ย้อนหลังเท่านั้นแม้ว่า ถ้าFILL_PARENTจะเลิก (ดังกล่าวโดยแมตต์บอลข้างต้น) MATCH_PARENTจากนั้นเป็นตัวเลือกสำหรับการทำงานร่วมกันเป็นไปข้างหน้า

2
เห็นด้วย แต่ถ้าคุณมีแผนที่จะเขียนรหัสสำหรับอุปกรณ์ระดับ API ที่ต่ำกว่าเช่น 2.3,2.2,2.1 สำหรับช่วงเวลาที่คุณต้องใช้ FILL_PARENT ฉันมีปัญหาในการใช้งาน match_parent สำหรับรุ่นเก่ากว่านี้
MSA

ได้เวลาลบคำตอบนี้แล้ว ไม่เกี่ยวข้องอีกต่อไปและสามารถให้คำแนะนำที่ไม่ถูกต้องแก่ผู้พัฒนาใหม่
Tim


8

match_parent จะใช้แทนfill_parentและตั้งค่าให้เป็นไปตามที่ผู้ปกครองไป เพียงแค่ใช้match_parentและลืมเกี่ยวกับfill_parent ฉันทิ้งสมบูรณ์fill_parentและทุกอย่างสมบูรณ์ตามปกติ

ตรวจสอบที่นี่เพื่อเพิ่มเติม


6

เพียงเพื่อให้มันชื่อที่ใกล้ชิดกับมันการกระทำที่เกิดขึ้นจริง "fill_parent"ไม่เติมช่องว่างที่เหลือตามชื่อที่บ่งบอก (สำหรับคุณใช้แอตทริบิวต์น้ำหนัก) แต่จะใช้พื้นที่มากเท่ากับพาเรนต์โครงร่าง นั่นคือเหตุผลที่ชื่อใหม่คือ"match_parent"


2
ฉันไม่เข้าใจตรรกะของผู้คนเมื่อพวกเขาระบุสิ่งนี้ ผู้ปกครองมีช่องว่างภายใน หรือลูกซ้ายของอีกคนหนึ่ง เด็กกำลังจับคู่หรือไม่ ไม่มันเติมเต็มพื้นที่ที่เหลืออยู่หรือไม่? ที่นี่ในสิ่งที่เห็นได้ชัดคือ Bizzarro World เราตอบ: ใช่
kaay

1
@kaay ฉันเห็นด้วยอย่างยิ่งว่าชื่อใหม่นั้นแย่กว่าชื่อเดิม แต่สิ่งที่ Google พูดไป
Caltor

6

ทั้งสองมีฟังก์ชั่นที่คล้ายกันแตกต่างกันเพียงอย่างเดียวคือ fill_parent ถูกใช้จนถึง API ระดับ 8 และ match_parent จะใช้หลังจาก API ระดับ 8 ขึ้นไป


6

เมื่อคุณตั้งค่ารูปแบบwidthและheight เป็นmatch_parentในXMLสถานที่ให้บริการก็จะครอบครองพื้นที่ที่สมบูรณ์แบบที่มุมมองที่ผู้ปกครองมีคือมันจะเป็นใหญ่เป็นผู้ปกครอง

<LinearLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="#f9b0b0">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#b0f9dc"/>

</LinearLayout>

แม่กระต่ายสีแดงและลูกเป็นสีเขียว เด็กครอบครองทุกพื้นที่ เพราะมันเป็นwidthและมีheight match_parent

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

หมายเหตุ: หากพาเรนต์ถูกนำไปใช้กับการเว้นวรรคดังนั้นพื้นที่นั้นจะไม่ถูกรวม

<LinearLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="#f9b0b0"
    android:paddingTop="20dp"
    android:paddingBottom="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#b0f9dc"/>

</LinearLayout>

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

ดังนั้น TextView hight = 300dp (ผู้ปกครองสูง) - (20 (paddingTop) +10 (paddingBottom)) = (300 - 30) dp = 270 dp

fill_parent Vs match_parent

fill_parent เป็นชื่อก่อนหน้าของ match_parent

สำหรับ API ระดับ 8 ขึ้นไปถูกfill_parentเปลี่ยนชื่อเป็นmatch_parentและfill_parentเลิกใช้แล้วในขณะนี้

ดังนั้นfill_parentและmatch_parentเหมือนกัน

เอกสาร API สำหรับ fill_parent

มุมมองควรมีขนาดใหญ่เท่ากับพาเรนต์ (ลบด้วยการเติมเต็ม) ค่าคงที่นี้ถูกคัดค้านเริ่มต้นจาก API ระดับ 8 และถูกแทนที่ด้วย {@code match_parent}


4

match_parent ซึ่งหมายความว่ามุมมองต้องการมีขนาดใหญ่เท่ากับพาเรนต์ (ลบด้วยการเติมเต็ม)

wrap_content ซึ่งหมายความว่ามุมมองต้องการมีขนาดใหญ่พอที่จะล้อมรอบเนื้อหา (บวกกับการเติมเต็ม)

เพื่อภาพประกอบที่ดีขึ้นฉันได้สร้างเค้าโครงตัวอย่างที่แสดงถึงแนวคิดนี้ เพื่อดูผลของมันฉันเพิ่มเส้นขอบของเนื้อหาข้อความแต่ละรายการ

ในเนื้อหาข้อความ "จับคู่พ่อแม่" เราจะเห็นว่าความกว้างของเค้าโครงนั้นยาวออกไป

แต่เราสามารถเห็นได้ในเนื้อหาแบบข้อความ "ห่อเนื้อหา" ความกว้างของเลย์เอาต์ห่อด้วยความยาวของเนื้อหา (เนื้อหาตัด)

เค้าโครง Android


4

match_parent และfill_parent เป็นคุณสมบัติเดียวกันที่ใช้กำหนดความกว้างหรือความสูงของมุมมองแบบเต็มหน้าจอในแนวนอนหรือแนวตั้ง

คุณสมบัติเหล่านี้ใช้ในไฟล์ android xml แบบนี้

 android:layout_width="match_parent"
 android:layout_height="fill_parent"

หรือ

 android:layout_width="fill_parent"
 android:layout_height="match_parent"

fill_parentถูกนำมาใช้ในรุ่นก่อนหน้า match_parentแต่ตอนนี้มันได้รับการคัดค้านและถูกแทนที่ด้วย ฉันหวังว่ามันจะช่วยคุณ


3

fill_parent: มุมมองควรมีขนาดใหญ่เท่ากับพาเรนต์

ตอนนี้เนื้อหานี้ fill_parent เลิกใช้แล้วและแทนที่ด้วย match_parent


3

ให้ฉันเติมผู้ปกครองและจับคู่ผู้ปกครองทำหน้าที่เดียวกันเท่านั้นที่:

parent parent : ถูกใช้ก่อน API 8

ตรงกับผู้ปกครอง นี้ถูกใช้จาก API 8+ ฟังก์ชั่นของทั้งสอง เติมมุมมองผู้ปกครองนอกเหนือจากการขยาย


2

FILL_PARENT ถูกเปลี่ยนชื่อ MATCH_PARENT ใน API ระดับ 8 ขึ้นไปซึ่งหมายความว่ามุมมองต้องการมีขนาดใหญ่เท่ากับพาเรนต์ (ลบด้วยการแพ็ด) - Google


2

FILL_PARENT เลิกใช้แล้วจาก API ระดับ 8 ขึ้นไปและเปลี่ยนชื่อเป็นเวอร์ชันด้านบนเป็น MATCH_PARENT

ทั้งสองเหมือนกันFILL_PARENTและMATCH_PARENT, FILL_PARENTถูกนำมาใช้ในรุ่นต่ำน้อยกว่าระดับ API 8 และ MATCH_PATENT จะใช้ในระดับสูง API สูงกว่า 8

FILL_PARENT(เปลี่ยนชื่อMATCH_PARENTใน API ระดับ 8 ขึ้นไป) ซึ่งหมายความว่ามุมมองต้องการมีขนาดใหญ่เท่ากับพาเรนต์ (ลบด้วยการเติมเต็ม)

fill_parent: มุมมองควรมีขนาดใหญ่เท่ากับพาเรนต์ (ลบด้วยการเติมเต็ม) อย่างต่อเนื่องนี้จะเลิกเริ่มต้นจากระดับ API 8 match_parentและจะถูกแทนที่ด้วย

สำหรับรายละเอียดเพิ่มเติมกรุณาเยี่ยมชมหน้านี้


0

1. match_parent

เมื่อคุณตั้งค่าความกว้างและความสูงของเลย์เอาต์เป็น match_parent มันจะครอบครองพื้นที่ทั้งหมดที่มุมมองพาเรนต์มีอยู่ซึ่งจะใหญ่พอ ๆ กับพาเรนต์

หมายเหตุ : หากพาเรนต์ถูกนำไปใช้กับการเว้นวรรคดังนั้นพื้นที่นั้นจะไม่ถูกรวม

เมื่อเราสร้าง layout.xml ตามค่าเริ่มต้นเราจะใช้ RelativeLayout เป็นมุมมองพาเรนต์เริ่มต้นพร้อมกับ Android: layout_width = "match_parent" และ android: layout_height = "match_parent" นั่นคือความกว้างและความสูงของหน้าจอมือถือทั้งหมด

โปรดทราบด้วยว่าการเติมเต็มนั้นใช้ได้กับทุกด้าน

android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"

ตอนนี้ให้เพิ่มมุมมองเชิงเส้นย่อย LinearLayout และตั้งค่า layout_width = "match_parent" และ layout_height = "match_parent" มุมมองกราฟิกจะแสดงบางอย่างเช่นนี้

match_parent_example

รหัส

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.code2care.android.togglebuttonexample.MainActivity" >

android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="11dp"
android:background="#FFFFEE"
android:orientation="vertical" >

2. fill_parent:

สิ่งนี้เหมือนกับ match_parent, fill_parent ถูกคิดค่าเสื่อมราคาในระดับ API 8 ดังนั้นหากคุณใช้ API ระดับ 8 ขึ้นไปคุณต้องหลีกเลี่ยงการใช้ fill_parent

ให้ทำตามขั้นตอนเดียวกับที่เราทำกับ match_parent เพียงใช้ fill_parent ทุกที่แทน

คุณจะเห็นว่าทั้งพฤติกรรม fill_parent และการจับคู่หลักไม่แตกต่างกัน

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