Junior
Kaip perduoti duomenis iš vieno fragmento į kitą?
sobes.tech AI
Atsakymas iš AI
-
Pakuočių argumentai: Naudojami perduoti primitivių tipų duomenis ir objektus, įgyvendinančius
ParcelablearbaSerializable, kuriant naują fragmento egzempliorių.// Siunčiančiame fragmente val bundle = Bundle().apply { putString("key", "value") } val fragment = TargetFragment().apply { arguments = bundle } // Priimančiame fragmente override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... duomenų naudojimas } -
Bendra ViewModel: Fragmentai, priklausantys tai pačiai Activity, gali naudoti bendrą
ViewModelduomenų keitimui.// SharedViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // Siunčiančiame fragmente private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.value = "value" // Priimančiame fragmente private val sharedViewModel: SharedViewModel by activityViewModels() sharedViewModel.data.observe(viewLifecycleOwner) { value -> // ... duomenų naudojimas } -
Naudojant sąsają callback: Vienas fragmentas iškviečia metodą Activity, o Activity tada iškviečia kitą fragmentą.
// Sąsaja Activity ar atskirame faile interface DataTransferListener { fun onDataReceived(data: String) } // Siunčiančiame fragmente (activity as? DataTransferListener)?.onDataReceived("value") // Activity, įgyvendinanti sąsają override fun onDataReceived(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment targetFragment?.updateUI(data) } // Priimančiame fragmente fun updateUI(data: String) { // ... UI atnaujinimas } -
Fragmentų rezultatų API: Šiuolaikiškas ir rekomenduojamas būdas keistis duomenimis tarp fragmentų.
// Siunčiančiame fragmente (nustatome rezultatą) setFragmentResult("requestKey", bundleOf("bundleKey" to "value")) // Priimančiame fragmente (klauso rezultato) setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... duomenų naudojimas }