Junior
Jak przekazywać dane z jednego fragmentu do drugiego?
sobes.tech AI
Odpowiedź od AI
-
Argumenty Bundle: Używane do przekazywania typów danych prostych i obiektów implementujących
ParcelablelubSerializablepodczas tworzenia nowej instancji fragmentu.// W fragmencie wysyłającym val bundle = Bundle().apply { putString("key", "value") } val fragment = TargetFragment().apply { arguments = bundle } // W fragmencie odbierającym override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... użycie value } -
Wspólny ViewModel: Fragmenty należące do tej samej Activity mogą korzystać z wspólnego
ViewModeldo wymiany danych.// SharedViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // W fragmencie wysyłającym private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.value = "value" // W fragmencie odbierającym private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.observe(viewLifecycleOwner) { value -> // ... użycie value } -
Użycie interfejsu zwrotnego: Jeden fragment wywołuje metodę w Activity, a Activity następnie wywołuje metodę w innym fragmencie.
// Interfejs w Activity lub w osobnym pliku interface DataTransferListener { fun onDataReceived(data: String) } // W fragmencie wysyłającym (activity as? DataTransferListener)?.onDataReceived("value") // W Activity implementującej interfejs override fun onDataReceived(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment targetFragment?.updateUI(data) } // W fragmencie odbierającym fun updateUI(data: String) { // ... aktualizacja UI z danymi } -
API wyników fragmentu: Nowoczesny i zalecany sposób wymiany danych między fragmentami.
// W fragmencie wysyłającym (ustawianie wyniku) setFragmentResult("requestKey", bundleOf("bundleKey" to "value")) // W fragmencie odbierającym (nasłuchiwanie wyniku) setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... użycie wyniku }