ความแตกต่างระหว่าง add (), replace () และ addToBackStack ()


300

อะไรคือความแตกต่างที่สำคัญระหว่างการเรียกใช้วิธีการเหล่านี้:

fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);

การแทนที่แฟรกเมนต์ที่มีอยู่แล้วหมายความว่าอย่างไรและการเพิ่มแฟรกเมนต์ให้กับสถานะกิจกรรมและการเพิ่มกิจกรรมในสแต็กหลัง

ประการที่สองด้วยfindFragmentByTag()การค้นหาแท็กนี้ด้วยadd()/ replace()method หรือaddToBackStack()วิธีการหรือไม่

คำตอบ:


331

1) fragmentTransaction.addToBackStack(str);

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

2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

คำอธิบาย - แทนที่ส่วนที่มีอยู่ที่ถูกเพิ่มไปยังคอนเทนเนอร์ นี่เป็นสิ่งสำคัญเหมือนกับการเรียก remove (Fragment) สำหรับแฟรกเมนต์ที่เพิ่มในปัจจุบันทั้งหมดที่ถูกเพิ่มด้วย containerViewId เดียวกันจากนั้นเพิ่ม (int, Fragment, String) ด้วยอาร์กิวเมนต์เดียวกันที่กำหนดไว้ที่นี่

3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

คำอธิบาย - เพิ่มส่วนย่อยให้กับสถานะกิจกรรม ส่วนนี้อาจเป็นทางเลือกนอกจากนี้ยังมีมุมมองของมัน (ถ้า Fragment.onCreateView ส่งกลับไม่เป็นโมฆะ) ลงในมุมมองคอนเทนเนอร์ของกิจกรรม

การแทนที่แฟรกเมนต์ที่มีอยู่แล้วหมายความว่าอย่างไรและการเพิ่มแฟรกเมนต์ให้กับสถานะกิจกรรมและการเพิ่มกิจกรรมในสแต็กหลัง

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

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

เมื่อคุณนำทางไปยังเค้าโครงปัจจุบันคุณมี ID ของคอนเทนเนอร์นั้นเพื่อแทนที่ด้วยแฟรกเมนต์ที่คุณต้องการ

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

findFragmentByTag ค้นหาแท็กที่เพิ่มโดยวิธีการเพิ่ม / แทนที่หรือวิธีการ addToBackStack นี้หรือไม่

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

ข้อมูลอ้างอิง: FragmentTransaction


2
ดังนั้นฉันสามารถเพิ่มชิ้นส่วนโดยแทนที่เมธอดที่กิจกรรมเริ่มต้นได้หรือไม่
Yohanes AI

(ไม่มีการเพิ่ม
แฟรกเมนต์

2
สามารถแยกส่วนภาชนะประกอบด้วยมากกว่าหนึ่งส่วนถ้าใช่มากกว่าวิธีการแทนที่ () วิธีการจะทำงาน ฉันจะแทนที่ frgaments ทั้งหมดใน container หรือ android api นั้นมีวิธีที่ยอมรับอาร์กิวเมนต์สามตัวคือ frgamentContainer ชิ้นส่วนใหม่และแทนที่ด้วยใคร
ved

1
@ved ไม่มันจะแทนที่ชิ้นส่วนทั้งหมดที่มีอยู่ในภาชนะที่มีอยู่ในปัจจุบัน
reubenjohn

330

ความแตกต่างที่สำคัญอีกอย่างหนึ่งระหว่างaddและreplaceนี่คือ:

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

ในแง่ของเหตุการณ์วงจรชีวิตส่วนของ onPause, onResume, onCreateViewและเหตุการณ์วงจรชีวิตอื่น ๆ จะถูกเรียกในกรณีของแต่พวกเขาเคยถูกเรียกในกรณีของreplaceadd

แก้ไข : หนึ่งควรจะระมัดระวังถ้าเธอใช้ชนิดของห้องสมุดรถบัสเหตุการณ์เช่นบางGreenrobot ของ Eventbusและนำชิ้นส่วนเดียวกันกับสแต็คชิ้นส่วนด้านบนของอื่น ๆ addผ่านทาง ในสถานการณ์สมมตินี้แม้ว่าคุณจะปฏิบัติตามแนวปฏิบัติที่ดีที่สุดและลงทะเบียนบัสเหตุการณ์ในonResumeและยกเลิกการลงทะเบียนonPauseเหตุการณ์บัสจะยังคงทำงานอยู่ในแต่ละอินสแตนซ์ของชิ้นส่วนที่เพิ่มเข้ามาเนื่องจากaddชิ้นส่วนจะไม่เรียกใช้ ในฐานะที่เป็นฟังเหตุการณ์บัสฟังผลในแต่ละอินสแตนซ์ที่ใช้งานของส่วนจะประมวลผลเหตุการณ์เดียวกันซึ่งอาจไม่เป็นสิ่งที่คุณต้องการ


1
ฉันคิดว่าวิธีการหนึ่งอาจใช้ในการประมวลผลเหตุการณ์ในแฟรกเมนต์ส่วนใหญ่และเรียกว่า cancelEventDelivery () หลังจากการประมวลผลเสร็จสมบูรณ์ คุณสามารถค้นหาเพิ่มเติมเกี่ยวกับวิธีการยกเลิกการส่งมอบ () วิธีการที่นี่github.com/greenrobot/EventBus/blob/master/…
Jeevan

6
+1 จากฉัน สำคัญมากที่จะรู้ว่าการแทนที่แฟรกเมนต์ปัจจุบันด้วยแฟรกเมนต์ใหม่หมายความว่าแฟรกเมนต์ก่อนหน้านี้จะถูกสร้างขึ้นใหม่เพื่อรับมันกลับมาเมื่อ popping กลับจากสแต็กแฟรกเมนต์
AndaluZ

onPause, onResume เชื่อมโยงกับกิจกรรมของโฮสต์อย่างแน่นหนา และพวกเขาไม่ได้โทรหาเมื่อเปลี่ยนชิ้นส่วน
Zar E Ahmer

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

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

99

ตัวอย่างกิจกรรมมี 2 แฟรกเมนต์และเราใช้FragmentManagerเพื่อแทนที่ / เพิ่มด้วยaddToBackstackแต่ละแฟรกเมนต์เป็นโครงร่างในกิจกรรม

ใช้แทนที่

ไปส่วนที่ 1

Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume

ไปส่วนที่ 2

Fragment2: onAttach
Fragment2: onCreate
Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume

ป๊อป Fragment2

Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

ป๊อป Fragment1

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach

ใช้เพิ่ม

ไปส่วนที่ 1

Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume

ไปส่วนที่ 2

Fragment2: onAttach
Fragment2: onCreate
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume

ป๊อป Fragment2

Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach

ป๊อป Fragment1

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach

ตัวอย่างโครงการ


1
ไม่ onPause()ควรถูกเรียกมาก่อนonStop()ในทุกการกระทำของป๊อป
iCantC

คำตอบที่ยอดเยี่ยมในการแยกความแตกต่างระหว่าง 'เพิ่ม ()' และ 'แทนที่ ()' แม้ว่าจะหายไปเกี่ยวกับ addToBackStack () upvote
Shirish Herwade

@ShirishHerwade ฉันเชื่อว่าเขาแสดงความแตกต่างระหว่างการเพิ่มและแทนที่ด้วย addToBackStack ในทั้งสองกรณี
CyberShark

38

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

ตัวเลือกที่ 1 - "addToBackStack ()" ไม่เคยถูกใช้

Case 1A - การเพิ่มการลบและคลิกปุ่มย้อนกลับ

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

กรณีที่ 1B - การเพิ่มการแทนที่และคลิกปุ่มย้อนกลับ

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

ตัวเลือกที่ 2 - "addToBackStack ()" ถูกใช้เสมอ

กรณี 2A - การเพิ่มการลบและคลิกปุ่มย้อนกลับ

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Fragment B is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Case 2B - การเพิ่มการแทนที่การลบและคลิกปุ่มย้อนกลับ

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView()  
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()   
Fragment B :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

ตัวเลือก 3 - "addToBackStack ()" ไม่ได้ใช้เสมอ (ในตัวอย่างด้านล่าง w / o แสดงว่าไม่ได้ใช้)

Case 3A - การเพิ่มการลบและคลิกปุ่มย้อนกลับ

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Case 3B - การเพิ่มการแทนที่การลบและคลิกปุ่มย้อนกลับ

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()   
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

1
อย่างทั่วถึงนั่นเอง ความพยายามดี!
pulp_fiction

ดังนั้นเราสามารถพูดได้ว่าในขณะที่ทำงานกับปุ่มย้อนกลับเป็นเศษเล็กเศษน้อยทำงานในลักษณะคล้ายกับฟังก์ชัน FragmentManager.popBackStack ()?
ตินติน

คำตอบที่ดีไม่สามารถจะดีกว่า คำตอบนี้ควรได้รับการยอมรับ
Shirish Herwade

25

ความแตกต่างพื้นฐานระหว่างadd()และreplace()สามารถอธิบายได้เป็น:

  • add() ใช้สำหรับเพิ่มชิ้นส่วนให้กับองค์ประกอบรูทบางส่วน
  • replace() มีพฤติกรรมคล้ายกัน แต่ในตอนแรกมันจะลบแฟรกเมนต์ก่อนหน้าและจากนั้นเพิ่มแฟรกเมนต์ถัดไป

เราสามารถเห็นความแตกต่างที่แน่นอนเมื่อเราใช้addToBackStack()ร่วมกับหรือadd()replace()

เมื่อเรากดปุ่มย้อนกลับในกรณีที่add()... onCreateView ไม่เคยถูกเรียก แต่ในกรณีที่replace()เมื่อเรากดปุ่มย้อนกลับ ... oncreateView จะถูกเรียกทุกครั้ง


1
ดังนั้นจะเพิ่ม () ส่งผลให้ภาระมากขึ้นในแง่ของหน่วยความจำ Android เนื่องจากมุมมองของส่วนก่อนหน้าไม่ได้ถูกทำลาย?
Derekyy

@ Derekyy ใช่ฉันคิดอย่างนั้น
Arpit J.

คือสิ่งที่ฉันกำลังมองหา
parvez rafi

2

เมื่อเราเพิ่มส่วนแรก -> ส่วนที่สองโดยใช้วิธีการเพิ่ม ()

 btn_one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"Click First 
Fragment",Toast.LENGTH_LONG).show();

                Fragment fragment = new SecondFragment();
                getActivity().getSupportFragmentManager().beginTransaction()
                        .add(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
//                        .replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();

            }
        });

เมื่อเราใช้ add () ในส่วน

E/Keshav SecondFragment: onAttach
E/Keshav SecondFragment: onCreate
E/Keshav SecondFragment: onCreateView
E/Keshav SecondFragment: onActivityCreated
E/Keshav SecondFragment: onStart
E/Keshav SecondFragment: onResume

เมื่อเราใช้ replace () ในส่วน

ไปที่แฟรกเมนต์แรกเป็นแฟรกเมนต์ที่สองใน First -> Second โดยใช้ replace () วิธีการ

 btn_one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"Click First Fragment",Toast.LENGTH_LONG).show();

                Fragment fragment = new SecondFragment();
                getActivity().getSupportFragmentManager().beginTransaction()
//                        .add(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
                        .replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();

            }
        });

E/Keshav SecondFragment: onAttach
E/Keshav SecondFragment: onCreate

E/Keshav FirstFragment: onPause -------------------------- FirstFragment
E/Keshav FirstFragment: onStop --------------------------- FirstFragment
E/Keshav FirstFragment: onDestroyView -------------------- FirstFragment

E/Keshav SecondFragment: onCreateView
E/Keshav SecondFragment: onActivityCreated
E/Keshav SecondFragment: onStart
E/Keshav SecondFragment: onResume

ในกรณีที่แทนที่ชิ้นส่วนแรกวิธีการเหล่านี้เรียกว่าพิเศษ (onPause, onStop, onDestroyView เรียกว่าพิเศษ)

E / Keshav FirstFragment: onPause

E / Keshav FirstFragment: onStop

E / Keshav FirstFragment: onDestroyView


0

ฟังก์ชั่นของ FragmentManger การเพิ่มและการแทนที่สามารถอธิบายได้ดังนี้ 1. add หมายความว่ามันจะเพิ่มส่วนใน stack back fragment และมันจะแสดงที่เฟรมที่คุณให้เช่น

getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)

2.replace หมายถึงคุณกำลังแทนที่ชิ้นส่วนด้วยแฟรกเมนต์อื่นที่เฟรมที่กำหนด

getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)

ยูทิลิตีหลักระหว่างสองคือเมื่อคุณย้อนกลับมาซ้อนกันการแทนที่จะรีเฟรชแฟรกเมนต์ แต่การเพิ่มจะไม่รีเฟรชแฟรกเมนต์ก่อนหน้า


0

สิ่งสำคัญที่ควรสังเกต:

ความแตกต่างระหว่างการแทนที่และแทนที่ด้วยแบ็คสแต็คคือเมื่อใดก็ตามที่เราใช้การแทนที่เท่านั้นแฟรกเมนต์จะถูกทำลาย (เรียกว่า ondestroy ()) และเมื่อเราใช้แทนที่ด้วยแบ็คสแต็ค ด้วย onCreateView ())


0

นี่คือรูปภาพที่แสดงความแตกต่างระหว่างadd()และreplace()

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นadd()วิธีการในการเพิ่มชิ้นส่วนที่ด้านบนของแฟรกเมนต์ก่อนหน้าใน FragmentContainer

ในขณะที่replace()วิธีการล้างทั้งหมดชิ้นส่วนก่อนหน้าจากภาชนะบรรจุแล้วเพิ่มใน FragmentContainer

addToBackStack คืออะไร

addtoBackStackวิธีการสามารถนำมาใช้กับ add () และวิธีการแทนที่ มันให้บริการวัตถุประสงค์ที่แตกต่างใน API ส่วน

จุดประสงค์คืออะไร?

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

กรณีที่ 1:

getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.fragmentContainer, fragment, "TAG")
            .addToBackStack("TAG")
            .commit();

ป้อนคำอธิบายรูปภาพที่นี่

กรณีที่ 2:

getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.fragmentContainer, fragment, "TAG")
            .commit();

ป้อนคำอธิบายรูปภาพที่นี่

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