正しい結果が得られます(パート2)。フラグメント結果API

Androidアプリケーションのコンポーネント間のデータ交換を簡素化するように設計されたJetpackライブラリの目新しさについての話を続けます。最初の部分は、アクティビティと新しい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はデータをFragmentAに渡します。 FragmentManagerはディスパッチャーとして機能します
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. 





これが最終的な実装の様子であり、以下のリンクにあります。
,

. , . 





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





アクティビティはFragmentAとFragmentBのホストです
FragmentA FragmentB

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



parentFragmentManager



.





, , DialogFragment , FragmentA FragmentC. 





FragmentAはFragmentCのホストです
FragmentA Fragment

, Fragment FragmentA :





  • FragmentManager requireActivity().supportFragmentManager





  • FragmentManager FragmentA. , FragmentA childFragmentManager, Fragment parentFragmentManager.





Lifeycle





, Fragment Result Api lifecycle- - , . . 





- onCreate, STARTED, FragmentManager , - .





フラグメントは最後に送信されたため、bundle3のみを受信します
bundle3,

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





DESTROYED状態に達すると、フラグメントは自動的にサブスクライブ解除されます
DESTROYED

, , “ ” .





結果を送信する前にスニペットサブスクライバーが閉じられていた場合は、再度開いたときに受信します。
- , .

, , ( CREATED), , .





結果の転送時にフラグメントがバックスタックにあるシナリオ

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





最後のサブスクライバーのみが結果を取得します

, : 





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





  • Api





  • - , view





  • (FragmentManager Parcelable)









  • ,





  • Bundle, . , ClassCastException. 





, Fragment Result Api , , ,








All Articles