กิจกรรมเดียวและชิ้นส่วนอื่น ๆ ทั้งหมด [ปิด]


158

ฉันคิดของการใช้หน้าจอเดียวกับActivityและ sreens อื่น ๆ ทั้งหมดที่มีและFragmentsmanaging all the fragments thru the activity

มันเป็นความคิดที่ดีหรือไม่? และคำตอบของฉันคือไม่แต่ก็ยังต้องการทราบเพิ่มเติมเกี่ยวกับความคิดนี้อย่างชัดเจน

ข้อดีและข้อเสียของความคิดคืออะไร

บันทึก:

กรุณาอย่าให้ลิงค์สำหรับชิ้นส่วนและกิจกรรม

แก้ไข:

นี่คือบางส่วนของแฟรกเมนต์และกิจกรรม:

ข้อดี:

  1. แฟรกเมนต์มีวัตถุประสงค์เพื่อใช้กับกิจกรรมเป็นกิจกรรมย่อย
  2. แฟรกเมนต์ไม่ใช่สิ่งทดแทนกิจกรรม
  3. แฟรกเมนต์มีความหมายสำหรับการนำมาใช้ใหม่ (จำเป็นต้องรู้ในสิ่งที่สามารถนำมาใช้ซ้ำได้)
  4. แฟรกเมนต์เป็นวิธีที่ดีที่สุดในการเขียนโค้ดเพื่อรองรับทั้งแท็บเล็ตและโทรศัพท์

จุดด้อย:

  1. เราจำเป็นต้องใช้อินเทอร์เฟซเพื่อรับข้อมูลจากแฟรกเมนต์
  2. สำหรับการสนทนาเราต้องแสดงให้ไกล

ทำไมเราควรใช้เศษถ้าเราไม่ได้พิจารณาแท็บเล็ต? เวลาเริ่มต้นแตกต่างกันระหว่างกิจกรรมและส่วนใด


คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงคิดว่าคำตอบนั้นไม่ใช่? ฉันไม่เห็นด้วย แต่มันง่ายกว่าที่จะจัดการกับข้อกังวลที่คุณอาจมีเกี่ยวกับวิธีการนั้นหากเรารู้ว่าข้อกังวลเหล่านั้นคืออะไร
Alexander Lucas

1
@AlexanderLucas คำตอบที่ฉันไม่ได้ให้เพราะการทำเช่นนั้นทำให้โค้ดของคุณน้อยลงเพิ่มความซับซ้อน
Vineet Shukla

@Ski คุณกำลังให้ความสำคัญกับการได้รับคำตอบมากขึ้นโปรดจดจ่อกับสิ่งที่ถูกถามและสิ่งที่ควรเป็นคำตอบที่ดีที่สุดที่คุณสามารถให้ได้
Vineet Shukla

3
สำหรับทุกคนที่พบสิ่งนี้ฉันหยุด refactor เพราะสิ่งที่ซับซ้อนจริงๆเร็วมาก
theblang

18
นี่เป็นคำถามที่ดีและไม่ควรถูกปิด
Jim In Texas

คำตอบ:


94

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

ที่กล่าวว่ามีหนึ่งActivityยังแนะนำซับซ้อนมากมาย สมมติว่าคุณมีแบบฟอร์มแก้ไขและสำหรับบางรายการที่ผู้ใช้ต้องเลือกหรือสร้างต้องการให้ไปที่หน้าจอใหม่ ด้วยกิจกรรมที่เราเพิ่งจะเรียกหน้าจอใหม่ด้วยstartActivityForResultแต่Fragmentsไม่มีสิ่งนั้นดังนั้นคุณจบลงด้วยการเก็บค่าในActivityและมีชิ้นส่วนแก้ไขหลักตรวจสอบActivityเพื่อดูว่าข้อมูลที่ได้รับการเลือกและควรจะแสดงให้ผู้ใช้

สิ่งที่ Aravind พูดเกี่ยวกับการติดอยู่กับActivityประเภทเดียวก็เป็นความจริง แต่ก็ไม่ได้ จำกัด อยู่แค่นั้น กิจกรรมของคุณจะเป็นแบบ FragmentActivity และตราบใดที่คุณไม่จำเป็นต้องMapViewมีข้อ จำกัด ใด ๆ หากคุณไม่ต้องการที่จะแสดงผลแผนที่ แต่ก็สามารถทำได้ แต่คุณจะต้องปรับเปลี่ยนทั้งห้องสมุด Android เข้ากันได้ที่จะมีการFragmentActivityขยายMapActivityหรือใช้ที่มีต่อสาธารณชนหุ่นยนต์สนับสนุน v4-googlemaps

ในที่สุด devs ส่วนใหญ่ที่ฉันรู้ว่าการไปตามActivityเส้นทางเดียวได้กลับไปที่หลาย ๆ กิจกรรมเพื่อทำให้โค้ดของพวกเขาง่ายขึ้น UI ฉลาด, บนแท็บเล็ต, บางครั้งคุณก็ติดอยู่กับการใช้งานActivityเพียงครั้งเดียวเพื่อให้ได้สิ่งที่บ้าคลั่งที่นักออกแบบของคุณสร้างขึ้นมาด้วย :)

- แก้ไข -

Google ได้เปิดตัวMapFragmentห้องสมุดความเข้ากันได้ในที่สุดดังนั้นคุณไม่จำเป็นต้องใช้แฮ็ค android-support-v4-googlemaps อีกต่อไป อ่านเกี่ยวกับการอัปเดตได้ที่นี่: Google Maps Android API v2

- แก้ไข 2 -

ฉันเพิ่งอ่านโพสต์ที่ยอดเยี่ยมเกี่ยวกับสถานะของชิ้นส่วนที่ทันสมัย ​​(2017) และจดจำคำตอบเก่านี้ คิดว่าฉันจะแบ่งปัน: Fragments: ทางออกสำหรับปัญหาทั้งหมดของ Android


6
มีsettargetfragmentและคุณสามารถจัดการกิจกรรมเช่นstartforresultขั้นตอน
Lalith B

1
ในความคิดของฉันมีกิจกรรมเพียงเพราะมันเป็นระบบเก่า ไม่พบแฟรกเมนต์มาก่อน ไม่มีอะไรที่กิจกรรมและชิ้นส่วนไม่สามารถทำได้นอกจากพิธีการ ฉันอาจจินตนาการได้ว่าในบางประเด็นกิจกรรมจะถูกลบออกและทุกอย่างเป็นส่วน ๆ
Ixx

1
การสรุปข้อเสียของชิ้นส่วนอย่างเดียวที่คุณให้มีอยู่จริง ๆ startActivityForResult ตามที่ Lalith B บอกว่ามีคู่และแผนที่ก็ไม่เป็นปัญหา นอกจากนั้นทุกอย่าง (การบันทึกสถานะ ฯลฯ ) สามารถจัดการได้ด้วยวิธีวงจรชีวิตของชิ้นส่วน
Ixx

85

ฉันกำลังจะทำโครงการให้เสร็จ (กำลังพัฒนา 5 เดือน) ที่มี 1 กิจกรรมและ 17 ชิ้นงานเต็มหน้าจอ นี่เป็นโปรเจ็กต์ชิ้นที่สองของฉัน (ก่อนหน้านี้คือ 4 เดือน)

ข้อดี

  • กิจกรรมหลักคือ 700 บรรทัดของโค้ดเพียงแค่จัดการลำดับของการนำทางแฟรกเมนต์
  • แต่ละส่วนแยกเป็นอย่างดีในระดับของตัวเองและค่อนข้างเล็ก (~ สองร้อยบรรทัดของเนื้อหา UI)
  • ฝ่ายบริหารสามารถพูดได้ว่า "เฮ้เราเปลี่ยนลำดับของหน้าจอเหล่านั้นได้อย่างไร" และฉันสามารถทำได้ง่ายมากเนื่องจากชิ้นส่วนเหล่านั้นไม่ได้ขึ้นอยู่กับกันและกันพวกเขาทั้งหมดสื่อสารผ่านกิจกรรม ฉันไม่ต้องขุดผ่านกิจกรรมส่วนตัวเพื่อค้นหาว่าพวกเขาโทรหากันที่ไหน
  • แอพของฉันมีกราฟิกหนักมากและจะไม่ทำงานเป็น 1 หน้าจอ 1 กิจกรรม กิจกรรมย่อยทั้งหมดในหน่วยความจำจะทำให้แอพหมดหน่วยความจำตลอดเวลาดังนั้นฉันจะต้องfinish()ทำกิจกรรมที่ไม่สามารถมองเห็นได้ทั้งหมดและใช้ตรรกะการควบคุมเดียวกันสำหรับการนำทางเช่นเดียวกับที่ฉันทำกับแฟรกเมนต์ อาจทำด้วยเศษเพียงเพราะสิ่งนี้
  • ถ้าเราเคยทำแอพแท็บเล็ตเราจะมีเวลาในการรีแฟคตอริ่งได้ง่ายขึ้นเพราะทุกอย่างแยกกันอยู่แล้ว

จุดด้อย

  • คุณต้องเรียนรู้วิธีใช้ชิ้นส่วนต่างๆ

1
ไม่แน่ใจเกี่ยวกับการมีส่วนมากเกินไปและตอนนี้กิจกรรมเท่านั้น ... ปัญหาใด ๆ ในการผลิตและโทษอยู่ที่คุณ !! :)
Shahar

1
@Dinash อย่าปล่อยให้ระบบปฏิบัติการรีสตาร์ทกิจกรรมของคุณ จัดการปฐมนิเทศเปลี่ยนแปลงตัวเอง อ่านเพิ่มเติมได้ที่นี่: stackoverflow.com/questions/5913130/…
Tamas

1
@Tamas คุณมีหน้าจอหลายส่วน (เช่นรายละเอียดหลัก) และถ้าเป็นเช่นนั้นคุณจัดการกับสิ่งนั้นได้อย่างไร
theblang

7
@Tamas วิธีนี้เป็นอย่างยิ่งต่อต้าน Android คุณจบด้วยชั้น GOD ระบบ Android ได้รับการออกแบบมาเพื่อทำงานกับกิจกรรม - เช่นคุณไม่มีวิธีที่ดีในการจัดการแถบเครื่องมือภายในชิ้นส่วนหลายชิ้น คุณไม่มีส่วนเริ่มต้นสำหรับผลลัพธ์และอีกมากมายไม่จำเป็น นั่นหมายความว่าคุณต้องเขียนตรรกะทั้งหมดที่มีอยู่แล้ว สิ่งที่เกี่ยวกับเครื่องรับสัญญาณออกอากาศท้องถิ่นบริการและส่วนประกอบ Android อื่น ๆ ในการเริ่มบริการคุณต้องทำสิ่งต่อไปนี้: getActivity ()! = null ... นี่มันน่าเกลียดจริงๆ การสื่อสารระหว่างแฟรกเมนต์นั้นแปลกมากถ้าคุณมีจำนวนมาก
Teodor

9
700 บรรทัด !!!! "อย่าง" ???? ชั้นเรียนฟรี
beplaya

16

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

กิจกรรมและแฟรกเมนต์ให้อะไรจริงๆ

  1. เหตุการณ์วงจรชีวิตและ backstack
  2. บริบทและทรัพยากร

ดังนั้นการใช้พวกเขาสำหรับการที่เท่านั้น พวกเขามีความรับผิดชอบมากพอไม่ต้องยุ่งกับมันมากเกินไป ฉันจะยืนยันว่าแม้กระทั่งการทำให้ TextView ในกิจกรรมหรือชิ้นส่วนเป็นสิ่งที่ไม่ดี มีวิธีการเช่นเหตุผลคือประชาชนดู findViewById (int ID)เป็นมหาชน

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

ในท้ายที่สุดคุณสามารถทำ backstack และวงจรชีวิตของคุณเอง แต่ทำไมต้องสร้างวงล้ออีกครั้ง

แก้ไข: ทำไมลงคะแนนนี้ คนชั้นเรียนวัตถุประสงค์เดียว! แต่ละกิจกรรมหรือชิ้นส่วนควรจะสามารถยกตัวอย่างผู้นำเสนอที่ทำให้มุมมองเป็นอินสแตนซ์ ผู้นำเสนอและมุมมองเป็นโมดูลที่สามารถเปลี่ยนได้ เหตุใดกิจกรรมหรือชิ้นส่วนควรมีความรับผิดชอบของผู้นำเสนอ


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

IMHO: หากคุณส่งแรงกระตุ้นไปยังมุมมองและผู้นำเสนอของคุณ (การเรียก 2 รวมกับ "โมดูล") คุณสามารถนำโมดูลนั้นกลับมาใช้ใหม่ได้พร้อมกับกิจกรรมอื่น ๆ ถ้ามันช่วยได้มันจะเป็นการดีที่สุดที่จะส่งผ่านกิจกรรมในรูปแบบ intrfce ที่แสดงเฉพาะสิ่งจำเป็น หากคุณเกลียดการค้นหามุมมองด้านนอกของแรงโน้มถ่วงคุณสามารถแทรกมุมมองทั้งหมดผ่านอินทราสนั้นเข้าไปใน pres./view จุดหลักคือฉันเชื่อว่าการเขียนโค้ด Android ควรจะทำเกินความคิดของ Actvities และ Frags, ดังนั้นคุณต้องติดตั้ง 2 เป็นเรื่องง่ายจากนั้นมันจะกลายเป็นสิ่งที่ชัดเจนและคุณไม่ได้ติดอยู่กับเว็บใดเว็บหนึ่ง รหัส.
beplaya

3
ปล่อย MVP คุณจะทำได้ดีกว่าโดยไม่ต้องใช้ Android คุณสามารถใช้เวลามากมายในการพยายามทำให้พอดีกับบล็อกรูปร่างบาง ๆ ผ่านรูที่มีรูปร่างแตกต่างกันซึ่งแน่นอนว่ามันเป็นความท้าทาย
58

12

ข้อดี

คุณสามารถควบคุมชิ้นส่วนของคุณจากกิจกรรมเดียวเนื่องจากชิ้นส่วนทั้งหมดเป็นอิสระจากกัน ชิ้นส่วนที่มีวงจรชีวิต (ที่onPause, onCreate, onStart... ) ของพวกเขาเอง โดยมีวงจรชีวิตชิ้นส่วนสามารถตอบสนองอย่างอิสระต่อเหตุการณ์บันทึกสถานะของพวกเขาผ่านonSaveInstanceStateและถูกนำกลับมา (เช่นเช่นเมื่อกลับมาทำงานหลังจากการโทรเข้ามาหรือเมื่อผู้ใช้คลิกที่ปุ่มย้อนกลับ)

จุดด้อย

  1. สร้างความซับซ้อนในรหัสกิจกรรมของคุณ
  2. คุณต้องจัดการคำสั่งของชิ้นส่วน

มันเป็นความคิดที่ดีเช่นเดียวกับถ้าคุณต้องการสร้างแอพที่คุณต้องการแสดงหลายมุมมอง จากแนวคิดนี้คุณจะสามารถดูชิ้นส่วนต่าง ๆ ในมุมมองเดียว ..


2

ขึ้นอยู่กับรูปแบบการออกแบบของแอพของคุณ สมมติว่าถ้าคุณใช้แท็บใน ActionBar ในเลย์เอาต์การออกแบบจากนั้นในกิจกรรมเดียวของแอปหนึ่งสามารถมีการเปลี่ยนแปลงชิ้นส่วนบนแท็บคลิก ดังนั้นตอนนี้คุณมีกิจกรรมและพูดว่าสามแท็บใน ActionBar และมุมมองสำหรับแท็บที่จัดเตรียมโดย Fragments ซึ่งทำให้ง่ายต่อการจัดการและเป็นไปได้เช่นกัน ดังนั้นทุกอย่างขึ้นอยู่กับรูปแบบการออกแบบของแอพของคุณและวิธีการตัดสินใจในการสร้างมันขึ้นมา


1

ข้อดี:

  • สามารถใช้เพื่อสร้างอินเทอร์เฟซเดียวที่ใช้งานได้โดยหลายขนาดหน้าจอและการวางแนวผ่านเค้าโครง xml

จุดด้อย:

  • ต้องการรหัสที่ซับซ้อนมากขึ้นในกิจกรรมของคุณ

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


สำหรับการวางแนวมันไม่จำเป็นต้องใช้เลย์เอาต์ xml ที่แตกต่างกัน
Vineet Shukla

@VineetShukla จริง แต่มันเป็นตัวเลือกเช่นเดียวกับการใช้เค้าโครง xml ที่แตกต่างกันตามขนาดหน้าจอ ตัวอย่างเช่นหน้าจอหลักของโทรศัพท์ Android ของฉันมีเลย์เอาต์ที่แตกต่างกันเมื่อฉันดูในแนวนอนและแนวตั้ง
สกี

0

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

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


"ฉันคิดว่าเป็นความคิดที่ไม่ดีที่การใช้งานโทรศัพท์จะต้องเปลี่ยนเป็นกิจกรรมเชื่อมโยงไปถึงเดียวเมื่อมีการนำแท็บหรือเมนูสไลด์ออกมาเนื่องจากแท็บหรือการนำทางเมนูเพียงผลลัพธ์ในหน้าจอใหม่อย่างสมบูรณ์" -> ไม่เข้าใจความหมายที่แท้จริงของคุณ แต่แท็บหรือเมนูด้านข้างไม่เป็นปัญหาในแอปที่ใช้งานง่าย (แท็บเล็ต / โทรศัพท์)
Ixx

-1

เหตุผลที่สำคัญที่สุดที่ฉันจะไม่ใช้วิธีการเดียวคือเพื่อให้วงจรชีวิตของกิจกรรมได้รับประโยชน์ กิจกรรมมีพฤติกรรมตามบริบทของแอปพลิเคชั่นบางส่วนและส่วนเสริมที่พฤติกรรมนั้น มีความสามารถในการใช้ประโยชน์จากขั้นตอน overridable ในวงจรชีวิตของกิจกรรมจะช่วยให้การแยกพฤติกรรมหนึ่งของกิจกรรมจากที่อื่นด้วยวิธีการเช่นและonPause onResumeวงจรชีวิตนี้ยังช่วยให้คุณกลับไปที่บริบทก่อนหน้า ด้วยวิธีการกิจกรรมเดียวเมื่อคุณออกจากส่วนที่คุณต้องสร้างกลไกเพื่อกลับไปที่มัน


4
ฉันไม่เชื่อว่านี่เป็นเรื่องจริง จากเอกสารวงจรชีวิต Fragment ( developer.android.com/guide/components/fragments.html#Lifecycle ): "วงจรชีวิตของกิจกรรมที่แฟรกเมนต์มีผลโดยตรงต่อวงจรชีวิตของแฟรกเมนต์ซึ่งแต่ละวงจรการเรียกกลับสำหรับกิจกรรม ส่งผลให้การเรียกกลับที่คล้ายกันสำหรับแต่ละส่วนตัวอย่างเช่นเมื่อกิจกรรมได้รับ onPause () แต่ละส่วนในกิจกรรมได้รับ onPause () "
สกี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.