ฉันสามารถตั้งค่าFragment
's Id
เพื่อที่ฉันสามารถใช้getSupportFragmentManager().findFragmentById(R.id.--)
?
ฉันสามารถตั้งค่าFragment
's Id
เพื่อที่ฉันสามารถใช้getSupportFragmentManager().findFragmentById(R.id.--)
?
คำตอบ:
คุณไม่สามารถตั้งค่า ID ของส่วนย่อยโดยใช้โปรแกรมได้
อย่างไรก็ตามมีสิ่งString tag
ที่คุณสามารถตั้งค่าภายใน FragmentTransaction ซึ่งสามารถใช้เพื่อระบุ Fragment โดยไม่ซ้ำกันได้
ขณะที่อเล็กเซย์ชี้ให้เห็นคุณสามารถส่งรหัสให้กับFragmentTransaction
's add(int, Fragment)
วิธี อย่างไรก็ตามสิ่งนี้ไม่ได้ระบุ ID สำหรับ Fragment ระบุ ID ของ a ViewGroup
เพื่อแทรกFragment
ลงใน สิ่งนี้ไม่ได้มีประโยชน์สำหรับจุดประสงค์ที่ฉันคาดหวังให้คุณมีเพราะมันไม่ได้ระบุตัวตนที่ไม่ซ้ำกันFragment
แต่ViewGroup
เป็น s รหัสเหล่านี้เป็นของภาชนะบรรจุที่หนึ่งหรือมากกว่าเศษสามารถเพิ่มแบบไดนามิก การใช้วิธีการดังกล่าวเพื่อระบุFragment
s จะทำให้คุณต้องเพิ่มViewGroup
s แบบไดนามิกลงในเค้าโครงสำหรับทุกครั้งที่Fragment
คุณแทรก นั่นจะค่อนข้างยุ่งยาก
ดังนั้นหากคำถามของคุณเป็นวิธีการสร้างตัวระบุที่ไม่ซ้ำกันสำหรับส่วนคุณกำลังเพิ่มแบบไดนามิกคำตอบคือการใช้FragmentTransaction
's เพิ่ม (int containerViewId ชิ้นส่วนแท็ก String) วิธีการและFragmentManager
' s findFragmentByTag (String)วิธีการ
ในแอปหนึ่งของฉันฉันถูกบังคับให้สร้างสตริงแบบไดนามิก แต่ก็ไม่ได้แพงขนาดนั้นเมื่อเทียบกับ FragmentTransaction ที่แท้จริง
ข้อดีอีกอย่างของวิธีการแท็กคือสามารถระบุ Fragment ที่ไม่ได้ถูกเพิ่มลงใน UI ดู FragmentTransaction ของเพิ่ม (Fragment, String)วิธีการ Fragment
ไม่จำเป็นต้องมีView
! นอกจากนี้ยังสามารถใช้เพื่อคงสถานะชั่วคราวระหว่างการเปลี่ยนแปลง config!
ปรากฎว่าคุณอาจไม่จำเป็นต้องรู้รหัสชิ้นส่วน
จากเอกสาร:
public abstract Fragment findFragmentById (int id)
Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.
ส่วนที่สำคัญคือ "เป็นรหัสคอนเทนเนอร์เมื่อเพิ่มในธุรกรรม"
ดังนั้น:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_holder, new AwesomeFragment())
.commit();
แล้ว
AwesomeFragment awesome = (AwesomeFragment)
getSupportFragmentManager()
.findFragmentById(R.id.fragment_holder);
จะทำให้คุณได้รับชิ้นส่วน (น่ากลัว) ที่จัดขึ้นใน R.id.fragment_holder
ในกรณีส่วนใหญ่คุณสามารถใช้แท็กแฟรกเมนต์และ ID ได้ คุณสามารถตั้งค่าแท็กใน
FragmentTransaction.add(Fragment fragment, String tag );
จากนั้นคุณสามารถใช้คำสั่งFragmentManager.findFragmentByTag(String tab)
เพื่อค้นหาส่วนที่เป็นปัญหา
ดังที่ Tom และคนอื่น ๆ พูดถึงไปแล้วมีหลายวิธีในการใส่แท็กบนส่วนย่อยและใช้แท็กนั้นเพื่อระบุตัวตน ปัญหาที่ตามมาที่ฉันพบในการแก้ปัญหาเหล่านี้คือส่วนที่ไม่ได้รับแท็กจนกว่าจะเชื่อมโยงกับกิจกรรม (หรือที่จริงแล้วFragmentManager
) จะทำอย่างไรถ้าจำเป็นต้องระบุชิ้นส่วนก่อนที่จะถูกแท็ก?
โซลูชันของฉันจนถึงตอนนี้ทั้งหมดอาศัยเคล็ดลับ (Java) ที่เก่าแก่ที่สุดในโลก: สร้างส่วนของเทมเพลตที่เรียบง่ายซึ่งใช้ id ในตัวสร้างตัวใดตัวหนึ่งและให้getFragmentId()
วิธีการที่ส่งคืน id นั้น จากนั้นฉันก็ปล่อยให้ชิ้นส่วนที่ต้องการการระบุตัวตนก่อนขยายเทมเพลตนั้นและ; วอยล่า! แก้ไขปัญหา.
อาจจะแก้ปัญหานี้โชคไม่ดีที่ต้องใช้ชุดของชิ้นส่วนแม่แบบหนึ่งสำหรับแต่ละประเภทชิ้นส่วนเป็นListFragment
, DialogFragment
หรือธรรมดาเก่าFragment
(POFO ?!) ที่ต้องการตัวแรก แต่สิ่งนี้สามารถจัดการได้ในกรณีของชิ้นส่วนที่ฉันคิดโดยพิจารณาจากผลกำไรที่ให้มา
ขอโทษที่ทำให้แผลหาย :-)
ไชโย!
ใช้สิ่งต่อไปนี้:
ในการเพิ่มส่วน:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
ในการระบุส่วนที่มีอยู่:
getFragmentManager().findFragmentByTag(fragmentName);
เมื่อใช้แท็กโปรดอย่าลืมเพิ่มไฟล์
fragmentTransaction.addToBackStack(null);
เพื่อให้ Fragment ของคุณกลับมาทำงานต่อแทนที่จะถูกทำลายตามที่ระบุไว้ในคู่มือสำหรับนักพัฒนา
ถ้าคุณไม่เรียก addToBackStack () เมื่อคุณทำธุรกรรมที่ลบส่วนย่อยส่วนนั้นจะถูกทำลายเมื่อมีการคอมมิตธุรกรรมและผู้ใช้ไม่สามารถย้อนกลับไปที่มันได้ ในขณะที่ถ้าคุณเรียก addToBackStack () เมื่อลบแฟรกเมนต์ส่วนแฟรกเมนต์นั้นจะหยุดทำงานและจะกลับมาทำงานต่อในภายหลังหากผู้ใช้นำทางกลับ
อยู่ท้ายหน้านี้
ฉันเสียเวลาประมาณ 30 นาทีในการพยายามหาสาเหตุว่าทำไมไม่พบ Fragment ของฉันผ่านการfindFragmentByTag();
โทรธรรมดา ๆ
นอกเหนือจากคำตอบของ Tom แล้ววิธีการแทนที่ยังรองรับแท็กแฟรกเมนต์นอกเหนือจากการเพิ่มเมธอด