Conseguimos o resultado certo (Parte 2). API Fragment Result

Continuamos a história das novidades da biblioteca Jetpack, projetada para simplificar a troca de dados entre os componentes de um aplicativo Android. A primeira parte foi dedicada à transferência de dados da Activity e do novo Api Activity Result.  





, 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 passa dados para FragmentA.  FragmentManager atua como despachante
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. 





É assim que se parece a implementação final, que pode ser encontrada no link a seguir.
,

. , . 





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 é o hospedeiro para FragmentA e FragmentB
FragmentA FragmentB

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



parentFragmentManager



.





, , DialogFragment , FragmentA FragmentC. 





FragmentA é o hospedeiro para FragmentC
FragmentA Fragment

, Fragment FragmentA :





  • FragmentManager requireActivity().supportFragmentManager





  • FragmentManager FragmentA. , FragmentA childFragmentManager, Fragment parentFragmentManager.





Lifeycle





, Fragment Result Api lifecycle- - , . . 





- onCreate, STARTED, FragmentManager , - .





O fragmento receberá apenas bundle3, uma vez que foi enviado por último
bundle3,

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





Os fragmentos são automaticamente cancelados quando o estado DESTROYED é alcançado
DESTROYED

, , “ ” .





Se o assinante do snippet foi fechado antes de enviar o resultado, ele o receberá quando for reaberto.
- , .

, , ( CREATED), , .





Cenário em que o fragmento está na pilha de retorno no momento da transferência do resultado

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





Apenas o último assinante obtém o resultado

, : 





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





  • Api





  • - , view





  • (FragmentManager Parcelable)









  • ,





  • Bundle, . , ClassCastException. 





, Fragment Result Api , , ,








All Articles