Nous obtenons le bon résultat (partie 2). API de résultat de fragment

Nous continuons l'histoire des nouveautés de la librairie Jetpack, conçue pour simplifier l'échange de données entre les composants d'une application Android. La première partie a été consacrée au transfert de données depuis Activity et au nouveau résultat d'activité Api.  





, 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 transmet les données à FragmentA.  FragmentManager agit en tant que répartiteur
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. 





Voici à quoi ressemble l'implémentation finale, que vous trouverez sur le lien ci-dessous.
,

. , . 





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, .





L'activité est l'hôte de FragmentA et FragmentB
FragmentA FragmentB

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



parentFragmentManager



.





, , DialogFragment , FragmentA FragmentC. 





FragmentA est l'hôte de FragmentC
FragmentA Fragment

, Fragment FragmentA :





  • FragmentManager requireActivity().supportFragmentManager





  • FragmentManager FragmentA. , FragmentA childFragmentManager, Fragment parentFragmentManager.





Lifeycle





, Fragment Result Api lifecycle- - , . . 





- onCreate, STARTED, FragmentManager , - .





Le fragment ne recevra que le bundle3, car il a été envoyé en dernier
bundle3,

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





Les fragments sont automatiquement désabonnés lorsque l'état DESTROYED est atteint
DESTROYED

, , “ ” .





Si l'abonné de l'extrait a été fermé avant l'envoi du résultat, il le recevra lors de sa réouverture.
- , .

, , ( CREATED), , .





Scénario où le fragment est dans la backstack au moment du transfert du résultat

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





Seul le dernier abonné obtient le résultat

, : 





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





  • Api





  • - , view





  • (FragmentManager Parcelable)









  • ,





  • Bundle, . , ClassCastException. 





, Fragment Result Api , , ,








All Articles