Kami mendapatkan hasil yang benar (Bagian 2). API Hasil Fragmen

Kami melanjutkan cerita tentang hal baru pustaka Jetpack, yang dirancang untuk menyederhanakan pertukaran data antar komponen aplikasi Android. Bagian pertama dikhususkan untuk mentransfer data dari Aktivitas dan Hasil Aktivitas Api baru.  





, Google Fragment. โ€œSingle Activityโ€ Android-.





โ€œ ?โ€ - . -: ViewModel, Activity, targetFragment . 





Fragment Result Api . , - . , Api , .





1.3.0-alpha04, FragmentManager FragmentResultOwner. , FragmentManger , . , .





, FragmentManager:





  • , FragmentManger setFragmentResultListener()







  • , FragmentManger Bundle, . setFragmentResult()







  • FragmentManger , Bundle , . 





:





FragmentB meneruskan data ke FragmentA.  FragmentManager bertindak sebagai dispatcher
FragmentB FragmentA . FragmentManager

Fragment Result Api lifecycle- - , STARTED, DESTROYED. 





โ€œ โ€ FragmentManger Map:





  • Map<String, Bundle>



    ,  





  • Map<String, LifecycleAwareResultListener>







FragmentResultListener, FragmentManager Map, , Map. , , FragmentResultListener LifecycleAwareResultListener.





, FragmentManager . , Map .





.





: ProductsFragment , , SortFragment . Fragment Result Api. 





Seperti inilah implementasi terakhirnya, yang dapat ditemukan di tautan di bawah ini.
,

. , . 





1

ProductsFragment, , FragmentManager. - setFragmentResultListener



fragment-ktx, , .





onCreate():





override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setFragmentResultListener("request_key") { key, bundle ->
        val selectedSort = bundle.getParcelable<Sort>("extra_key")
        //   
   }
}
      
      



2

SortFragment , setFragmentResult, Bundle. 





applyButton.setOnClickListener {
   setFragmentResult(
      "request_key",
       bundleOf("extra_key" to getSelectedSort())
   )
}
      
      



, Fragment Result Api. 





Api , , FragmentManager  .





FragmentManager





FragmentManager . : parentFragmentManager, childFragmentManager FragmentManager -. , FragmentManager.





master-detail . , FragmentA FragmentB, .





Activity adalah tuan rumah untuk FragmentA dan FragmentB
FragmentA FragmentB

FragmentManager -, .. . FragmentManager requireActivity().supportFragmentManager



parentFragmentManager



.





, , DialogFragment , FragmentA FragmentC. 





FragmentA adalah tuan rumah untuk FragmentC
FragmentA Fragment

, Fragment FragmentA :





  • FragmentManager requireActivity().supportFragmentManager





  • FragmentManager FragmentA. , FragmentA childFragmentManager, Fragment parentFragmentManager.





Lifeycle





, Fragment Result Api lifecycle- - , . . 





- onCreate, STARTED, FragmentManager , - .





Fragmen hanya akan menerima bundle3, karena terakhir dikirim
bundle3,

STARTED, FragmentManager , ( FragmentManager Map<String, Bundle>, ).





Fragmen secara otomatis dihentikan langganannya saat status DESTROYED tercapai
DESTROYED

, , โ€œ โ€ .





Jika pelanggan cuplikan ditutup sebelum mengirimkan hasilnya, ia akan menerimanya ketika dibuka kembali.
- , .

, , ( CREATED), , .





Skenario ketika fragmen berada di backstack pada saat mentransfer hasilnya

, . ? , FragmentManager Map<String, LifecycleAwareListener>, . , .





Hanya pelanggan terakhir yang mendapatkan hasilnya

, : 





  • Fragment Result Api , . , targetFrament , targetFrament Deprecated.





  • Api





  • - , view





  • (FragmentManager Parcelable)









  • ,





  • Bundle, . , ClassCastException. 





, Fragment Result Api , , ,








All Articles