Junior
Jak předávat data z jednoho fragmentu do druhého?
sobes.tech AI
Odpověď od AI
-
Argumenty balíčku: Používají se k předání primitivních datových typů a objektů implementujících
ParcelableneboSerializablepři vytváření nové instance fragmentu.// V odesílajícím fragmentu val bundle = Bundle().apply { putString("key", "value") } val fragment = TargetFragment().apply { arguments = bundle } // V přijímajícím fragmentu override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... použití hodnoty } -
Sdílené ViewModel: Fragmenty patřící k jedné Activity mohou používat společný
ViewModelpro výměnu dat.// SharedViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // V odesílajícím fragmentu private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.value = "value" // V přijímajícím fragmentu private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.observe(viewLifecycleOwner) { value -> // ... použití hodnoty } -
Použití rozhraní callback: Jeden fragment volá metodu v Activity, a Activity pak volá metodu v jiném fragmentu.
// Rozhraní v Activity nebo v samostatném souboru interface DataTransferListener { fun onDataReceived(data: String) } // V odesílajícím fragmentu (activity as? DataTransferListener)?.onDataReceived("value") // V Activity, která implementuje rozhraní override fun onDataReceived(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment targetFragment?.updateUI(data) } // V přijímajícím fragmentu fun updateUI(data: String) { // ... aktualizace UI s daty } -
API výsledků fragmentu: Moderní a doporučený způsob výměny dat mezi fragmenty.
// V odesílajícím fragmentu (nastavení výsledku) setFragmentResult("requestKey", bundleOf("bundleKey" to "value")) // V přijímajícím fragmentu (poslouchání výsledku) setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... použití výsledku }