Obtenemos el resultado correcto (Parte 2). API de resultado de fragmentos

Continuamos la historia sobre las novedades de la biblioteca Jetpack, diseñada para simplificar el intercambio de datos entre los componentes de una aplicación de Android. La primera parte se dedicó a transferir datos de Activity y el nuevo Resultado de Actividad de 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 pasa datos a FragmentA.  FragmentManager actúa como despachador
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. 





Así es como se ve la implementación final, que se puede encontrar en el enlace a continuación.
,

. , . 





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





La actividad es el anfitrión de FragmentA y FragmentB
FragmentA FragmentB

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



parentFragmentManager



.





, , DialogFragment , FragmentA FragmentC. 





FragmentA es el anfitrión de FragmentC
FragmentA Fragment

, Fragment FragmentA :





  • FragmentManager requireActivity().supportFragmentManager





  • FragmentManager FragmentA. , FragmentA childFragmentManager, Fragment parentFragmentManager.





Lifeycle





, Fragment Result Api lifecycle- - , . . 





- onCreate, STARTED, FragmentManager , - .





El fragmento solo recibirá bundle3, ya que se envió por última vez
bundle3,

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





Los fragmentos se cancelan automáticamente cuando se alcanza el estado DESTROYED
DESTROYED

, , “ ” .





Si el suscriptor del fragmento se cerró antes de enviar el resultado, lo recibirá cuando se vuelva a abrir.
- , .

, , ( CREATED), , .





Escenario en el que un fragmento está en el backstack en el momento de transferir el resultado

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





Solo el último suscriptor obtiene el resultado

, : 





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





  • Api





  • - , view





  • (FragmentManager Parcelable)









  • ,





  • Bundle, . , ClassCastException. 





, Fragment Result Api , , ,








All Articles