Junior
Ako prenášať údaje z jedného fragmentu do druhého?
sobes.tech AI
Odpoveď od AI
-
Argumenty balíka: Používajú sa na prenos primitívnych typov údajov a objektov implementujúcich
ParcelablealeboSerializablepri vytváraní nového inštancie fragmentu.// V odosielajúcom fragmente val bundle = Bundle().apply { putString("key", "value") } val fragment = TargetFragment().apply { arguments = bundle } // V prijímajúcom fragmente override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... použitie value } -
Zdieľaný ViewModel: Fragmenty patriace jednej Activity môžu používať spoločný
ViewModelna výmenu údajov.// SharedViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // V odosielajúcom fragmente private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.value = "value" // V prijímajúcom fragmente private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.observe(viewLifecycleOwner) { value -> // ... použitie value } -
Použitie rozhrania callback: Jeden fragment volá metódu v Activity, a Activity následne volá metódu v inom fragmente.
// Rozhranie v Activity alebo samostatnom súbore interface DataTransferListener { fun onDataReceived(data: String) } // V odosielajúcom fragmente (activity as? DataTransferListener)?.onDataReceived("value") // V Activity, ktorá implementuje rozhranie override fun onDataReceived(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment targetFragment?.updateUI(data) } // V prijímajúcom fragmente fun updateUI(data: String) { // ... aktualizácia UI s údajmi } -
Fragment Result API: Moderný a odporúčaný spôsob na výmenu údajov medzi fragmentmi.
// V odosielajúcom fragmente (nastavujeme výsledok) setFragmentResult("requestKey", bundleOf("bundleKey" to "value")) // V prijímajúcom fragmente (počúvame výsledok) setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... použitie result }