อะไรคือความแตกต่างระหว่าง Fragment และ FragmentActivity?


160

คำถามของฉันคือนอกเหนือจากความแตกต่างที่เห็นได้ชัดมรดกสิ่งที่เป็นความแตกต่างที่สำคัญระหว่างFragmentและFragmentActivity? แต่ละสถานการณ์เหมาะสมกับสถานการณ์ใดที่สุด ฉันพยายามเข้าใจว่าทำไมทั้งสองคลาสนี้ถึงมีอยู่ ...

คำตอบ:


280

A Fragmentคือส่วนของ a Activityซึ่งมี:

  • วงจรชีวิตของตัวเอง
  • รับกิจกรรมอินพุตของตัวเอง
  • สามารถเพิ่มหรือลบได้ในขณะที่Activityกำลังทำงาน

จะต้องฝังอยู่ในFragmentActivity

Fragmentsไม่ได้เป็นส่วนหนึ่งของ API ก่อนหน้า HoneyComb (3.0) หากคุณต้องการที่จะใช้Fragmentsในแอปกำหนดเป้าหมายแพลตฟอร์มรุ่นก่อนที่จะมีรังผึ้งคุณต้องเพิ่มแพคเกจการสนับสนุนโครงการของคุณและใช้ในการถือของคุณFragmentActivity ชั้นจะมี API สำหรับการจัดการกับในขณะที่ระดับก่อนที่จะมีรังผึ้งไม่FragmentsFragmentActivityFragmentsActivity

หากโครงการของคุณกำหนดเป้าหมายรังผึ้งหรือใหม่กว่าเท่านั้นคุณควรใช้Activityและไม่ได้ที่จะถือของคุณFragmentActivityFragments

รายละเอียดบางอย่าง:

ใช้กับandroid.app.Fragment Activityใช้กับandroid.support.v4.app.Fragment FragmentActivityอย่าเพิ่มแพ็คเกจการสนับสนุนFragmentลงในActivityเนื่องจากจะทำให้เกิดข้อยกเว้น

สิ่งที่ต้องระวัง: FragmentManagerและLoaderManagerมีรุ่นสนับสนุนแยกต่างหากสำหรับ FragmentActivity:

หากคุณใช้FragmentในActivity(HoneyComb ขึ้นไป) ให้โทร

  • getFragmentManager() เพื่อรับ android.app.FragmentManager
  • getLoaderManager() เพื่อรับ android.app.LoaderManager

หากคุณกำลังใช้ a FragmentในFragmentActivity(pre-HoneyComb) โทร:

  • getSupportFragmentManager()android.support.v4.app.FragmentManagerที่จะได้รับ
  • getSupportLoaderManager() เพื่อรับ android.support.v4.app.LoaderManager

ดังนั้นอย่าทำ

//don't do this
myFragmentActivity.getLoaderManager(); 
//instead do this:
myFragmentActivity.getSupportLoaderManager();

หรือ

//don't do this:
android.app.FragmentManager fm = myFragmentActivity.getSupportFragmentManager();
//instead do this:
android.support.v4.app.FragmentManager fm = myFragmentActivity.getSupportFragmentManager()

ประโยชน์ที่ควรทราบคือในขณะที่ต้องมีการแยกส่วนในActivityนั้นไม่จำเป็นต้องเป็นส่วนหนึ่งของActivityเค้าโครง สามารถใช้เป็นพนักงานที่มองไม่เห็นสำหรับกิจกรรมโดยไม่มี UI ของมันเอง


6
อย่างไรก็ตามส่วนไม่จำเป็นต้องเป็นส่วนหนึ่งของเค้าโครงกิจกรรม คุณอาจใช้ชิ้นส่วนที่ไม่มี UI ของตัวเองเป็นผู้ทำงานที่มองไม่เห็นสำหรับกิจกรรม
uzay95

1
@ uzay95 ขอบคุณที่ชี้นำสิ่งนี้ ฉันเพิ่มส่วนท้ายเพื่อพูดถึงมัน
Gunnar Karlsson

@GunnarKarlsson เราจะเพิ่มส่วนในส่วนของกิจกรรมหรือไม่
Dhasneem

2
@Dhasneem คุณเพิ่ม Fragment ให้กับ FragmentActivity หากคุณต้องการให้แอปของคุณทำงานบน Android เวอร์ชันต่ำกว่า 3.0 มิฉะนั้นคุณจะเพิ่มส่วนในกิจกรรม
Gunnar Karlsson

2
ขอบคุณ! นี่เป็นการแก้ปัญหาของฉัน! ตอนนี้ฉันรู้แล้วว่าทำไมแอปของฉัน (เขียนด้วยกิจกรรม) มักจะเกิดข้อผิดพลาดที่ onCreate หลังจากเพิ่มปุ่มเข้าสู่ระบบ Facebook (พวกเขาใช้ android.support.v4.app.Fragment ในตัวอย่างของพวกเขา) แน่นอนว่ายังมีเหตุผลอื่นสำหรับความผิดพลาด แต่คำตอบของคุณคือชิ้นสุดท้ายที่จะนำมารวมกัน
Chlind

14

FragmentActivity เป็นกิจกรรมคลาสสิกของเราด้วยการสนับสนุนการแยกส่วนไม่มีอะไรเพิ่มเติม ดังนั้น FragmentActivity จึงเป็นสิ่งจำเป็นเมื่อ Fragment จะถูกแนบกับกิจกรรม

Well Fragment เป็นองค์ประกอบที่ดีที่คัดลอกพฤติกรรมพื้นฐานของกิจกรรม แต่ยังไม่ใช่องค์ประกอบของแอปพลิเคชันแบบสแตนด์อะโลนเช่นกิจกรรมและจำเป็นต้องแนบกับกิจกรรมเพื่อที่จะทำงาน

ดูที่นี่สำหรับรายละเอียดเพิ่มเติม


1
BTW คำตอบที่ล้าสมัยซึ่งใช้กับแอปที่ต้องการทำงานกับอุปกรณ์ที่เก่ากว่า API 11 เท่านั้น
ToolmakerSteve

@ToolmakerSteve คุณสามารถให้รายละเอียดเพิ่มเติมได้หรือไม่ ถ้าเป็นไปได้คุณสามารถแก้ไขคำตอบด้วยรุ่นล่าสุดได้หรือไม่?
GökhanBarış Aker

8

คิดว่า FragmentActivity เป็นคลาสกิจกรรมปกติที่สามารถรองรับ Fragments ได้ ก่อนที่จะมีรังผึ้งคลาสกิจกรรมไม่สามารถแทนที่แฟรกเมนต์โดยตรงดังนั้นจำเป็นต้องมีในกิจกรรมที่ใช้แฟรกเมนต์

หากการกระจายเป้าหมายของคุณคือ Honeycomb และมากกว่านั้นคุณสามารถขยายออกจากกิจกรรมแทน

นอกจากนี้แฟรกเมนต์จะถูกพิจารณาเป็น 'กิจกรรมย่อย' ไม่สามารถอยู่ได้หากไม่มีกิจกรรม คิดว่าส่วนย่อยเป็นกิจกรรมย่อยและคุณควรจะดี ดังนั้นกิจกรรมน่าจะเป็นของผู้ปกครองและส่วนย่อยของความสัมพันธ์เชิงสัญลักษณ์ของเด็ก


1

FragmentActivity เป็นกิจกรรมแบบเฉพาะกิจที่มี Fragment ในคำพูดเหล่านี้ผมได้อธิบายคุณเกี่ยวกับการเปลี่ยนแปลงที่สำคัญอย่างหนึ่งซึ่งกับ android 3.0 (HoneyComb) ทีม android ได้แทรกลงใน android sdk

ด้วยแนวคิดรูปแบบใหม่เหล่านี้โค้ดและเลย์เอาต์ของคุณจะยืดหยุ่นและบำรุงรักษาได้มากขึ้น หากคุณค้นหาใน google มีตัวอย่างมากมาย

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