آموزش انتقال داده بین فرگمنت ها در کاتلین
سلام دوستان عزیز در این سری از آموزش برنامه نویسی اندروید به آموزش انتقال داده بین فرگمنت ها در کاتلین انتقال داده بین fragment ها مثل همیشه یک مقدار مشکل است و در صورتی که بخواهید داده را بین فرگمنت ها (fragment) منتقل کنید نیازمند context, interfaces, shared view model, or application-level live data هستیم در ادامه با ما همراه باشید تا با استفاده از api جدید ResultListener این کار را انجام دهیم.
خب برویم سراغ کد در نظر میگیریم یک فرگمنت داریم و می خواهیم یک دیالوگ در فرگمنت parent نمایش دهیم مثل زیر
1 2 3 4 5 | private fun showOptionsDialog() { val optionsDialogInstance = OptionsDialogFragment() optionsDialogInstance.setTargetFragment(this, 1) optionsDialogInstance.show(childFragmentManager, optionsDialogInstance.tag) } |
تنها چیز مهمی که در اینجا انجام داده شده است استفاده از متد setTargetFragment که شما هم باید این کار انجام دهید.
و در نهایت داده را به شکل زیر ارسال می کنیم.
1 2 3 4 5 6 | fun onExit(selectionValue: String){ val intent = Intent() intent.putExtra("selection",selectionValue) intent.putExtra(TYPE,type) targetFragment?.onActivityResult(targetRequestCode, Activity.RESULT_OK, intent) } |
کد بالا فقط برای زمانی کار می کند که دو تا فرگمنت در یک Fragment manager باشند پس یعنی بین دو فرگمنت کد بالا به درستی کار نخواهد کرد ولی راه حل این کار استفاده از ResultListener است که در ادامه کد آن را مشاهده می کنید.
1 2 3 4 5 6 7 8 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Use the Kotlin extension in the fragment-ktx artifact setFragmentResultListener("requestKey") { key, bundle -> val result = bundle.getString("name") // Do something with the result... } } |
کد بالا تا زمانی که داده ای دریافت کند منتظر می ماند.
در فرگمنت دیگر کد زیر را استفاده کتید.
1 2 3 | tvSave.setOnClickListener { setResult("requestKey", bundleOf("name" to updatedValue)) } |
به همین سادگی می توانید بین دو فرگمنت داده را دریافت کنید.
اگر چند فرگمنت داخل هم دیگر بودند می توانید از کد زیر نیز استفاده کنید.
1 2 3 4 5 6 7 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) childFragmentManager.setResultListener("uniquerequestKey") { key, bundle -> val result = bundle.getString("name") // Do something with the result.. } } |
استفاده از این روش خیلی بهتر از استفاده از متغیر Static است.
موفق و پیروز باشید.