ความหมายของ addToBackStack ที่มีพารามิเตอร์ null คืออะไร?


97

ฉันมีรหัสลูกค้า มีเพียงกิจกรรมเดียวสำหรับชิ้นส่วนทั้งหมดนั่นคือกิจกรรมเดียวคือการจัดการชิ้นส่วนทั้งหมด

กิจกรรมนี้มีรหัสต่อไปนี้สำหรับส่วนใด ๆ ที่ส่วนท้ายของวิธีการของส่วนนั้น -

ตัวอย่างเช่น - ส่วน MoreFragment:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

ดังนั้น,

1) ความหมายของaddToBackStack(null)ตามด้วย a commit()คืออะไร?

2) ทำไมคุณต้องส่งผ่านพารามิเตอร์ null ไปaddToBackStack?

3) จะรับชิ้นส่วนนั้นได้อย่างไรหลังจากถูกเพิ่มเข้าไปเช่นนี้?

ดูเหมือนว่ารหัสนี้จะไร้ประโยชน์เมื่อฉันรันโค้ดโดยไม่มีบรรทัดสุดท้าย.addToBackStack(null).commit()และมันก็ทำงานโดยไม่มีปัญหาใด ๆ


developer.android.com/reference/android/app/… ในบางกรณีคุณต้องเรียกวิธีนั้น
Lucifer


3
คุณสามารถส่งชื่อแฟรกเมนต์เป็นพารามิเตอร์เพื่อ addToBackStack (name) แทน Null หากคุณผ่าน Null คุณจะไม่สามารถใช้เมธอด FragmentManager.popBackStackImmediate (ชื่อสตริงแฟล็ก int) หรือ popBackStack (ชื่อสตริงแฟล็ก int); เพราะชื่อนี้เป็น Null ดังนั้นวิธีการ popBackstack จะไม่ทำงาน ฉันขอแนะนำให้คุณส่งชื่อ Fragment เป็นพารามิเตอร์แทนการส่ง null
luckylukein

คำตอบ:


114

ความหมายของ addToBackStack (null) ตามด้วยการกระทำ () คืออะไร?

อ้างเอกสาร:

เมื่อเรียก addToBackStack () ธุรกรรมการแทนที่จะถูกบันทึกลงในกองหลังเพื่อให้ผู้ใช้สามารถย้อนกลับธุรกรรมและนำส่วนก่อนหน้ากลับมาได้โดยการกดปุ่มย้อนกลับ

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

ลำดับที่คุณเพิ่มการเปลี่ยนแปลงใน FragmentTransaction ไม่สำคัญยกเว้น:

คุณต้องโทรเป็นcommit()ครั้งสุดท้าย หากคุณกำลังเพิ่มชิ้นส่วนหลายชิ้นลงในคอนเทนเนอร์เดียวกันลำดับที่คุณเพิ่มจะกำหนดลำดับที่ปรากฏในลำดับชั้นของมุมมอง

ดังนั้นคุณต้องกระทำในที่สุด

ทำไมคุณต้องส่งพารามิเตอร์ null เพื่อ addToBackStack

ไม่จำเป็นต้องเป็นโมฆะสามารถเป็นสตริงได้ หากคุณไม่ต้องการเพียงแค่ส่งค่าว่าง

FragmentTransaction นามธรรมสาธารณะ addToBackStack (ชื่อสตริง)

เพิ่มใน API ระดับ 11 เพิ่มธุรกรรมนี้ในกองหลัง ซึ่งหมายความว่าธุรกรรมจะถูกจดจำหลังจากที่มีการคอมมิตและจะย้อนกลับการดำเนินการเมื่อดึงออกจากสแตกในภายหลัง

ชื่อพารามิเตอร์ชื่อทางเลือกสำหรับสถานะแบ็กสแต็กหรือค่าว่าง

เกี่ยวกับ:

ดูเหมือนว่ารหัสนี้จะไร้ประโยชน์เมื่อฉันรันโค้ดโดยไม่มีบรรทัดสุดท้าย. addToBackStack (null) .commit () และมันทำงานโดยไม่มีปัญหาใด ๆ

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

จะรับชิ้นส่วนนั้นได้อย่างไรหลังจากถูกเพิ่มแบบนี้?

firstFragmentคุณมีอยู่แล้วเช่นชิ้นส่วน ดังนั้นฉันไม่รู้ว่าคุณหมายถึงอะไรเมื่อได้รับชิ้นส่วนในภายหลัง

ข้อมูลมากกว่านี้ @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


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

ตามที่ฉันเข้าใจแล้วจุดประสงค์ทั้งหมดของการเพิ่มใน backstack คือการนำทางเหมือนกับที่เราทำกับปุ่มย้อนกลับเพื่อไปยังส่วนก่อนหน้า
My God

โอเคถ้าคุณส่งพารามิเตอร์ไปยัง addToBackStack ทำไมเราต้องทำgetFragmentManager().popBackStackImmediate()ถ้าปุ่มย้อนกลับสามารถทำได้ด้วยตัวเองโดยมี / ไม่มีพารามิเตอร์ผ่าน? ดูคำตอบของ - stackoverflow.com/questions/21156153/…
My God

@VedPrakash คุณไม่จำเป็นต้องมี นั่นเป็นคำถามและคำตอบที่แตกต่างกันโดยสิ้นเชิง คุณสามารถค้นหาตัวเองได้อย่างง่ายดายด้วยการเพิ่มชิ้นส่วนสองชิ้นลงในกองหลังและกดปุ่มย้อนกลับ
Raghunandan

@VedPrakash อ่านการจัดการชิ้นส่วน @ developer.android.com/guide/components/fragments.html
Raghunandan

17

tagสตริงในaddToBackStack(String name)ให้วิธีการหาสแต็คกลับมาในภายหลังปรากฏโดยตรงไปยังสถานที่ที่ หมายถึงใช้ในวิธีการpopToBackStack(String name, int flags):

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

ชื่อ: ถ้าไม่ใช่ค่าว่างนี่คือชื่อของสถานะย้อนกลับก่อนหน้าที่จะค้นหา หากพบสถานะทั้งหมดที่อยู่ในสถานะนั้นจะปรากฏขึ้น สามารถใช้แฟล็ก POP_BACK_STACK_INCLUSIVE เพื่อควบคุมว่าสถานะที่ตั้งชื่อเองจะถูกป็อปหรือไม่ หากเป็นค่าว่างระบบจะแสดงเฉพาะสถานะบนสุดเท่านั้น

แฟล็ก: 0 หรือ POP_BACK_STACK_INCLUSIVE

ในคำอื่น ๆ ก็จะปรากฏสแต็คของคุณกลับจนกว่าจะพบชิ้นส่วนที่ถูกเพิ่มโดยในnameaddToBackStack(String name)

ตัวอย่างเช่นหากคุณทำชุดข้อมูลเพิ่มเติมหรือแทนที่ตัวจัดการส่วนที่ให้ชื่อ "frag1", "frag2", "frag3", "frag4" และในภายหลังต้องการกลับไปที่แฟรกเมนต์ 2 โดยตรงที่เพิ่มด้วย addToBackStack (" Frag2 ") คุณโทรpopToBackStack("frag2", 0).

ดังนั้น,

  • ใช้.addToBackStack("fragName"): หากคุณต้องการpopToBackStack(String name, int flags)ให้ป๊อปสแต็กด้านหลังมากกว่าหนึ่งรายการ

  • ใช้.addToBackStack(null): หากคุณไม่ต้องการให้ป๊อปสแต็กด้านหลังมากกว่าหนึ่งในภายหลัง แต่ยังคงต้องการแสดงทีละรายการ ทำเช่นนี้แม้ว่าคุณจะไม่ได้เรียกใช้ popToBackStack () อย่างชัดเจน แต่จะปล่อยให้การใช้งานเริ่มต้นของการกดย้อนกลับจัดการแบ็กสแต็กแทน

  • ใช้.disallowAddToBackStack(): หากคุณไม่ต้องการให้กดย้อนกลับหรือเรียกใช้ popBackStack () อย่างชัดเจน จะทำให้แน่ใจว่าไม่มีส่วนใดของโค้ดที่ใช้. addToBackStack ()


1

คำตอบของคุณเลิกใช้แล้ว หากคุณไม่ต้องการเพิ่มเศษเล็กเศษน้อยในกองหลังคุณควรใช้ข้อมูลโค้ดด้านล่าง:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

ด้านล่างนี้คุณมีตัวอย่างวิธีการใช้งานที่น่ารัก :

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
เลิกใช้งานที่ไหน ฉันไม่เห็นอะไรเลยในเอกสารหรือแหล่งที่มาของ FragmentTransaction
Rup

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