Middle
Navedite sve načine prenosa podataka između fragmenata.
sobes.tech АИ
Одговор од АИ
-
Argumenti paketa: Najčešći način. Podaci se prosleđuju u obliku Bundle putem metode
setArguments()fragmenta.// U fragmentu-pošiljaocu val bundle = Bundle() bundle.putString("key", "value") val targetFragment = TargetFragment() targetFragment.arguments = bundle // ... prelaz na TargetFragment // U fragmentu-primaocu override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... koristimo vrednost } -
Shared ViewModel: Koristi se za prenos podataka povezanih sa životnim ciklusom aktivnosti ili više fragmenata.
// U ViewModel-u class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // U oba fragmenta private val sharedViewModel: SharedViewModel by activityViewModels() // U fragmentu-pošiljaocu sharedViewModel.data.value = "prosleđeni podaci" // U fragmentu-primaocu sharedViewModel.data.observe(viewLifecycleOwner) { data -> // ... koristimo podatke } -
Interfejsi za povratni poziv: Fragment može definisati interfejs koji implementira aktivnost. Fragment poziva metode tog interfejsa, prosleđujući podatke aktivnosti, koja ih zatim može proslediti drugom fragmentu.
// Interfejs u fragmentu-pošiljaocu interface OnDataPass { fun onDataPass(data: String) } // Fragment-pošiljalac private var dataPasser: OnDataPass? = null override fun onAttach(context: Context) { super.onAttach(context) if (context is OnDataPass) { dataPasser = context } else { throw RuntimeException("$context mora implementirati OnDataPass") } } fun passData(data: String) { dataPasser?.onDataPass(data) } // Aktivnost class MainActivity : AppCompatActivity(), OnDataPass { override fun onDataPass(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment targetFragment?.updateData(data) // Pretpostavlja se metoda updateData u TargetFragment } } // Fragment-primaoc fun updateData(data: String) { // ... ažuriramo UI ili čuvamo podatke } -
Fragment Result API: Moderni način prenosa rezultata između fragmenata, predstavljen u AndroidX Fragment verziji 1.3.0.
// U fragmentu-pošiljaocu setFragmentResult("requestKey", bundleOf("bundleKey" to "rezultat")) // U fragmentu-primaocu setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... koristimo rezultat }