Fragment หรือ Support Fragment?


125

ฉันกำลังพัฒนาแอพที่รองรับ Android> = 4.0 มันใช้ชิ้นส่วนจากandroid.appแพ็คเกจ ในขณะที่ฉันกำลังประสบปัญหากับการใช้งานแฟรกเมนต์รุ่นเก่าใน 4.0 เช่นนี้ซึ่งได้รับการแก้ไขแล้วในไลบรารีการสนับสนุนฉันกำลังพิจารณาเปลี่ยนกลับไปใช้การใช้งานแฟรกเมนต์จากไลบรารีการสนับสนุนเพื่อให้ได้การใช้งานที่เชื่อถือได้และสอดคล้องกันมากขึ้น

คุณมีความคิดเห็นอย่างไรกับเรื่องนี้? คุณใช้ชิ้นส่วนจากไลบรารีการสนับสนุนแม้ว่าจะมีให้ใช้งานแล้วเมื่อพัฒนาสำหรับ Android 4


2
นี่เป็นคำถามที่ดี (+1 เพราะทำให้ฉันสงสัย) นอกจากนี้ยังไม่มีคำอธิบายที่ดีบนเว็บสำหรับเรื่องนี้ ฉันใช้ไลบรารีการสนับสนุนสำหรับแอพของฉันและฉันสงสัยว่าฉันผิดหรือไม่เพราะฉันไม่สังเกตเห็นข้อผิดพลาดใด ๆ ในขณะรวบรวมหรือระหว่างการทดสอบ
JJ86

2
@animuson คำตอบโดย brillenheini พิสูจน์ได้ว่านี่ไม่ใช่คำตอบตามความคิดเห็นเป็นหลัก
OneWorld

คำตอบ:


90

จากประสบการณ์ของฉันการใช้การใช้งานส่วนเดียวกันบนอุปกรณ์ Android ทั้งหมดเป็นข้อได้เปรียบที่ดี ฉันไม่สามารถกำจัด NullPointerExceptions ทั้งหมดได้เมื่อมีการบันทึกสถานะบน Android 4.0 โดยใช้แฟรกเมนต์ดั้งเดิมพร้อมกับไลบรารีการสนับสนุนที่หายไปทั้งหมด นอกจากนี้ฉันยังไม่เห็นข้อเสียใด ๆ กับแนวทางนี้

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


11
แล้วจุดประสงค์ของตอนandroid.app.Fragmentนั้นคืออะไร? หากคุณสามารถเพิ่มไปยังคำตอบของคุณที่นี่มีคำอธิบายมากขึ้นอีกนิดผมจะมีความพึงพอใจอย่างเต็มที่ ขอบคุณ!
jonstaff

1
@jonstaff เหตุผลน่าจะเป็นประวัติศาสตร์ โปรดดูคำตอบที่อัปเดตของฉันที่นั่น
brillenheini

11
เพื่อความสมบูรณ์ดูเหมือนว่าจะมีสิ่งที่สนับสนุนส่วนที่ไม่สามารถทำได้ (เช่นการเคลื่อนไหวด้วยobjectAnimatorแม้ว่าระบบปฏิบัติการเป้าหมายจริงจะรองรับก็ตาม) ซึ่งในกรณีที่คุณใช้ViewPagerหมายความว่าคุณต้องใช้อะแดปเตอร์จากไลบรารีการสนับสนุน v13 มิฉะนั้นคุณจะไม่สามารถมีทั้ง viewpager และภาพเคลื่อนไหวพลิกได้
GSerg

5
โปรดระวังในเดือนสิงหาคม 2014 ไลบรารี v13 ไม่สามารถทำ Nested Fragments ได้
Martin Marconcini

1
ทำไมคนใน Google ถึงเลือกใช้ไลบรารี v13 สำหรับแอป iosched github.com/google/iosched/blob/master/android/src/main/java/com/…พวกเขาต้องมีเหตุผลบางอย่าง
forcewill

40

เหตุผลสำคัญประการหนึ่งที่ต้องใช้SupportFragmentเวลาสักระยะหนึ่งคือคุณไม่มีสิทธิ์เข้าถึงChildFragmentManagerจนกว่า API 17 ไลบรารีการสนับสนุนจะให้เวอร์ชันสนับสนุนของตัวจัดการส่วนย่อย

สิ่งนี้จะกลายเป็นเรื่องใหญ่หากคุณมีเศษชิ้นส่วนที่มีเศษชิ้นส่วนอื่น ๆ สิ่งนี้เป็นเรื่องปกติในแอปพลิเคชันแท็บเล็ตที่มีความซับซ้อนและ / หรือสถาปัตยกรรมโดยรวมของคุณขึ้นอยู่กับเค้าโครงแบบแท็บหรือใช้ลิ้นชักการนำทาง


21

ฉันยังรู้สึกหงุดหงิดที่ต้องรวมไลบรารีการสนับสนุนแม้ว่าจะกำหนดเป้าหมายเป็น Android 4.0+ แต่ดูเหมือนว่าจะแนะนำอย่างเป็นทางการ:

แพ็คเกจ Android Support Library ประกอบด้วยไลบรารีหลายไลบรารีที่สามารถรวมอยู่ในแอปพลิเคชันของคุณ ไลบรารีเหล่านี้แต่ละแห่งรองรับเวอร์ชันแพลตฟอร์ม Android และชุดคุณสมบัติที่เฉพาะเจาะจง

คู่มือนี้อธิบายคุณสมบัติที่สำคัญและการสนับสนุนเวอร์ชันที่ให้บริการโดยไลบรารีสนับสนุนเพื่อช่วยคุณตัดสินใจว่าคุณควรรวมคุณลักษณะใดไว้ในแอปพลิเคชันของคุณ โดยทั่วไปเราขอแนะนำให้รวมไลบรารี v4 support และ v7 appcompat เนื่องจากรองรับ Android เวอร์ชันต่างๆและมี API สำหรับรูปแบบอินเทอร์เฟซผู้ใช้ที่แนะนำ

http://developer.android.com/tools/support-library/features.html


นี่ควรเป็นคำตอบที่ได้รับการยอมรับแม้ว่า @brillenheini จะให้คำตอบเองก็ตาม ตอบคำถามด้วยความถูกต้องและรัดกุมที่สุด
Arvindh Mani

4

IMHO หากคุณวางแผนที่จะพัฒนาสำหรับ 4.0 เท่านั้นฉันขอแนะนำให้ใช้ไลบรารีเนทีฟเนื่องจากไฟล์ปฏิบัติการจะมีขนาดเล็กลง เป็นเรื่องจริงที่คุณอาจประสบปัญหาข้อบกพร่องในเวอร์ชันแรก ๆ แต่ฉันคิดว่าสิ่งเหล่านี้ส่วนใหญ่น่าจะเป็นเรื่องเล็กน้อยในการแก้ไข นอกจากนี้ไลบรารีความเข้ากันได้ควรจะแมปกับแฟรกเมนต์ดั้งเดิมในกรณีที่คุณใช้งานบน 4.0 ขึ้นไปอยู่ดี ดังนั้นคุณอาจต้องต่อสู้กับปัญหาเหล่านี้ต่อไป ปัญหาเกี่ยวกับไลบรารีการสนับสนุนคือคุณมีคลาสจำนวนมากปรากฏขึ้นเป็น 2 เท่า (ครั้งเดียวในโครงสร้างแพ็กเกจการสนับสนุนและอีกครั้งในโครงสร้างแพ็กเกจ "เนทีฟ") ซึ่งทำให้การพัฒนายุ่งยากขึ้นเล็กน้อย

อย่างไรก็ตามหากคุณต้องการเปิดตัวแอปของคุณก่อน 4.0 ก็ไม่มีวิธีใดในไลบรารีการสนับสนุน นอกจากนี้เนื่องจากมีผู้ใช้ประมาณ 38% ของผู้ใช้ทั้งหมดที่ใช้เวอร์ชัน 2.3 จึงอาจเหมาะสมที่จะรวม OS เวอร์ชันนี้ไว้ด้วย ในกรณีนี้คุณสามารถใช้ไลบรารีสนับสนุนร่วมกับ Jake Wartons ActionBarSherlock (หรือกับ googles สนับสนุน ActionBar Library เมื่อเปิดตัวในที่สุด)


3
ขอบคุณสำหรับคำตอบ. เพราะฉันต้องการ ViewPager ฉันจึงต้องรวมไลบรารีสนับสนุนอยู่ดี นอกจากนี้ส่วนการสนับสนุนจะไม่พยายามเปลี่ยนไปใช้การใช้งานแบบเนทีฟหากมี นั่นคือสิ่งที่เอกสารบอก
brillenheini

ใช่สิ่งนี้คือ (ตามที่ @brillenheini กล่าวไว้) เพื่อให้มี ViewPager คุณต้องใช้ v4 ดังนั้นแม้ว่าคุณจะกำหนดเป้าหมายเฉพาะอุปกรณ์ v13 + คุณก็มีแนวโน้มที่จะมี v4 ต่อไป
Sotti

ฉันเพิ่งค้นพบเช่นกัน (ViewPager ต้องการ v4) ใน API 21 และในแอป Meh: - /
mraviator

2

ตอนนี้ดูเหมือนว่าจะดีกว่าที่จะใช้ Support Library เพราะฉันเห็นคำสั่งที่นี่https://developer.android.com/reference/android/app/Fragment.html

คลาสนี้เลิกใช้แล้วในระดับ API P ใช้ Support Library Fragment สำหรับพฤติกรรมที่สอดคล้องกันในทุกอุปกรณ์และเข้าถึง Lifecycle

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