Android - ตั้งรหัสส่วนย่อย


111

ฉันสามารถตั้งค่าFragment's Idเพื่อที่ฉันสามารถใช้getSupportFragmentManager().findFragmentById(R.id.--)?


คุณสามารถตั้งค่าได้ในไฟล์รูปแบบ xml
Vladimir Eremeev

คำตอบ:


117

คุณไม่สามารถตั้งค่า ID ของส่วนย่อยโดยใช้โปรแกรมได้

อย่างไรก็ตามมีสิ่งString tagที่คุณสามารถตั้งค่าภายใน FragmentTransaction ซึ่งสามารถใช้เพื่อระบุ Fragment โดยไม่ซ้ำกันได้

ขณะที่อเล็กเซย์ชี้ให้เห็นคุณสามารถส่งรหัสให้กับFragmentTransaction's add(int, Fragment)วิธี อย่างไรก็ตามสิ่งนี้ไม่ได้ระบุ ID สำหรับ Fragment ระบุ ID ของ a ViewGroupเพื่อแทรกFragmentลงใน สิ่งนี้ไม่ได้มีประโยชน์สำหรับจุดประสงค์ที่ฉันคาดหวังให้คุณมีเพราะมันไม่ได้ระบุตัวตนที่ไม่ซ้ำกันFragmentแต่ViewGroupเป็น s รหัสเหล่านี้เป็นของภาชนะบรรจุที่หนึ่งหรือมากกว่าเศษสามารถเพิ่มแบบไดนามิก การใช้วิธีการดังกล่าวเพื่อระบุFragments จะทำให้คุณต้องเพิ่มViewGroups แบบไดนามิกลงในเค้าโครงสำหรับทุกครั้งที่Fragmentคุณแทรก นั่นจะค่อนข้างยุ่งยาก

ดังนั้นหากคำถามของคุณเป็นวิธีการสร้างตัวระบุที่ไม่ซ้ำกันสำหรับส่วนคุณกำลังเพิ่มแบบไดนามิกคำตอบคือการใช้FragmentTransaction's เพิ่ม (int containerViewId ชิ้นส่วนแท็ก String) วิธีการและFragmentManager' s findFragmentByTag (String)วิธีการ

ในแอปหนึ่งของฉันฉันถูกบังคับให้สร้างสตริงแบบไดนามิก แต่ก็ไม่ได้แพงขนาดนั้นเมื่อเทียบกับ FragmentTransaction ที่แท้จริง

ข้อดีอีกอย่างของวิธีการแท็กคือสามารถระบุ Fragment ที่ไม่ได้ถูกเพิ่มลงใน UI ดู FragmentTransaction ของเพิ่ม (Fragment, String)วิธีการ Fragmentไม่จำเป็นต้องมีView! นอกจากนี้ยังสามารถใช้เพื่อคงสถานะชั่วคราวระหว่างการเปลี่ยนแปลง config!


หากฉันใช้แท็กและไม่ใช่ ID สำหรับแฟรกเมนต์ฉันจะใช้การเรียกแทนที่ซึ่งต้องการ ID ทรัพยากรแฟรกเมนต์ได้อย่างไร
น้ำรฐา

12
@TomDignan แล้วส่วนที่จะเพิ่มใน ViewPager ล่ะ ฉันจะตั้งแท็กของเขาได้อย่างไร? ฉันไม่สามารถใช้ธุรกรรมในสถานการณ์นี้
GuilhE

1
@GuilhE Activity มีวิธี addFragment () ซึ่งคุณสามารถอ้างอิงได้จาก viewpager การเก็บแท็กไว้ก่อนหน้านั้นสามารถทำได้ด้วยแฮชแมป
Thomas Dignan

1
คำตอบสามารถแก้ไขเล็กน้อยเพื่อเน้นว่าคุณสามารถตั้งค่า id ในรูปแบบ xml ได้หรือไม่ เนื่องจากส่วนตัวไม่ได้อ่านคำถามอื่น ๆ และรู้สึกว่าไม่มีทางเลยที่จะตั้ง id เป็นส่วนย่อย ...
Ivan

41

ปรากฎว่าคุณอาจไม่จำเป็นต้องรู้รหัสชิ้นส่วน

จากเอกสาร:

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


4

ในกรณีส่วนใหญ่คุณสามารถใช้แท็กแฟรกเมนต์และ ID ได้ คุณสามารถตั้งค่าแท็กใน
FragmentTransaction.add(Fragment fragment, String tag );จากนั้นคุณสามารถใช้คำสั่งFragmentManager.findFragmentByTag(String tab)เพื่อค้นหาส่วนที่เป็นปัญหา


2

ดังที่ Tom และคนอื่น ๆ พูดถึงไปแล้วมีหลายวิธีในการใส่แท็กบนส่วนย่อยและใช้แท็กนั้นเพื่อระบุตัวตน ปัญหาที่ตามมาที่ฉันพบในการแก้ปัญหาเหล่านี้คือส่วนที่ไม่ได้รับแท็กจนกว่าจะเชื่อมโยงกับกิจกรรม (หรือที่จริงแล้วFragmentManager) จะทำอย่างไรถ้าจำเป็นต้องระบุชิ้นส่วนก่อนที่จะถูกแท็ก?

โซลูชันของฉันจนถึงตอนนี้ทั้งหมดอาศัยเคล็ดลับ (Java) ที่เก่าแก่ที่สุดในโลก: สร้างส่วนของเทมเพลตที่เรียบง่ายซึ่งใช้ id ในตัวสร้างตัวใดตัวหนึ่งและให้getFragmentId()วิธีการที่ส่งคืน id นั้น จากนั้นฉันก็ปล่อยให้ชิ้นส่วนที่ต้องการการระบุตัวตนก่อนขยายเทมเพลตนั้นและ; วอยล่า! แก้ไขปัญหา.

อาจจะแก้ปัญหานี้โชคไม่ดีที่ต้องใช้ชุดของชิ้นส่วนแม่แบบหนึ่งสำหรับแต่ละประเภทชิ้นส่วนเป็นListFragment, DialogFragmentหรือธรรมดาเก่าFragment(POFO ?!) ที่ต้องการตัวแรก แต่สิ่งนี้สามารถจัดการได้ในกรณีของชิ้นส่วนที่ฉันคิดโดยพิจารณาจากผลกำไรที่ให้มา

ขอโทษที่ทำให้แผลหาย :-)

ไชโย!


0

ใช้สิ่งต่อไปนี้:

ในการเพิ่มส่วน:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

ในการระบุส่วนที่มีอยู่:

getFragmentManager().findFragmentByTag(fragmentName);

คำตอบไม่เกี่ยวข้องกับคำถาม โปรดอัปเดตคำตอบ Happy Coding
CodeWithVikas

-1

เมื่อใช้แท็กโปรดอย่าลืมเพิ่มไฟล์

fragmentTransaction.addToBackStack(null); 

เพื่อให้ Fragment ของคุณกลับมาทำงานต่อแทนที่จะถูกทำลายตามที่ระบุไว้ในคู่มือสำหรับนักพัฒนา

ถ้าคุณไม่เรียก addToBackStack () เมื่อคุณทำธุรกรรมที่ลบส่วนย่อยส่วนนั้นจะถูกทำลายเมื่อมีการคอมมิตธุรกรรมและผู้ใช้ไม่สามารถย้อนกลับไปที่มันได้ ในขณะที่ถ้าคุณเรียก addToBackStack () เมื่อลบแฟรกเมนต์ส่วนแฟรกเมนต์นั้นจะหยุดทำงานและจะกลับมาทำงานต่อในภายหลังหากผู้ใช้นำทางกลับ

อยู่ท้ายหน้านี้

ฉันเสียเวลาประมาณ 30 นาทีในการพยายามหาสาเหตุว่าทำไมไม่พบ Fragment ของฉันผ่านการfindFragmentByTag();โทรธรรมดา ๆ


-2

นอกเหนือจากคำตอบของ Tom แล้ววิธีการแทนที่ยังรองรับแท็กแฟรกเมนต์นอกเหนือจากการเพิ่มเมธอด

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