Wir machen das Ergebnis richtig (Teil 2). Fragment-Ergebnis-API

Wir setzen die Geschichte über die Neuheiten der Jetpack-Bibliothek fort, die den Datenaustausch zwischen den Komponenten einer Android-Anwendung vereinfachen sollen. Der erste Teil war der Übertragung von Daten aus der Aktivität und dem neuen Api-Aktivitätsergebnis gewidmet.  





, 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 übergibt Daten an FragmentA.  FragmentManager fungiert als 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. 





So sieht die endgültige Implementierung aus, die Sie unter dem folgenden Link finden.
,

. , . 





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





Aktivität ist der Host für FragmentA und FragmentB
FragmentA FragmentB

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



parentFragmentManager



.





, , DialogFragment , FragmentA FragmentC. 





FragmentA ist der Host für FragmentC
FragmentA Fragment

, Fragment FragmentA :





  • FragmentManager requireActivity().supportFragmentManager





  • FragmentManager FragmentA. , FragmentA childFragmentManager, Fragment parentFragmentManager.





Lifeycle





, Fragment Result Api lifecycle- - , . . 





- onCreate, STARTED, FragmentManager , - .





Das Fragment empfängt nur Bundle3, da es zuletzt gesendet wurde
bundle3,

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





Fragmente werden automatisch abgemeldet, wenn der Status ZERSTÖRT erreicht ist
DESTROYED

, , “ ” .





Wenn der Snippet-Abonnent vor dem Senden des Ergebnisses geschlossen wurde, erhält er es beim erneuten Öffnen.
- , .

, , ( CREATED), , .





Szenario, in dem sich das Fragment zum Zeitpunkt der Übertragung des Ergebnisses im Backstack befindet

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





Nur der letzte Teilnehmer erhält das Ergebnis

, : 





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





  • Api





  • - , view





  • (FragmentManager Parcelable)









  • ,





  • Bundle, . , ClassCastException. 





, Fragment Result Api , , ,








All Articles