Middle
Uveďte všetky spôsoby prenosu údajov medzi fragmentmi.
sobes.tech AI
Odpoveď od AI
-
Argumenty balíka: Najbežnejší spôsob. Dáta sa odovzdávajú vo forme Bundle prostredníctvom metódy
setArguments()fragmentu.// Vo vysielajúcom fragmente val bundle = Bundle() bundle.putString("key", "value") val targetFragment = TargetFragment() targetFragment.arguments = bundle // ... prechod na TargetFragment // Vo prijímajúcom fragmente override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... používame hodnotu } -
Shared ViewModel: Používa sa na odovzdávanie údajov súvisiacich s životným cyklom aktivity alebo viacerých fragmentov.
// V ViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // V oboch fragmentech private val sharedViewModel: SharedViewModel by activityViewModels() // Vo vysielajúcom fragmente sharedViewModel.data.value = "odovzdávané údaje" // Vo prijímajúcom fragmente sharedViewModel.data.observe(viewLifecycleOwner) { data -> // ... používame údaje } -
Rozhrania spätného volania: Fragment môže definovať rozhranie, ktoré implementuje aktivita. Fragment volá metódy tohto rozhrania, odovzdávajúc údaje aktivite, ktorá ich môže následne odovzdať inému fragmentu.
// Rozhranie vo vysielajúcom fragmente interface OnDataPass { fun onDataPass(data: String) } // Vysielajúci fragment private var dataPasser: OnDataPass? = null override fun onAttach(context: Context) { super.onAttach(context) if (context is OnDataPass) { dataPasser = context } else { throw RuntimeException("$context musí implementovať OnDataPass") } } fun passData(data: String) { dataPasser?.onDataPass(data) } // Aktivita class MainActivity : AppCompatActivity(), OnDataPass { override fun onDataPass(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment targetFragment?.updateData(data) // Predpokladá sa metóda updateData v TargetFragment } } // Prijímajúci fragment fun updateData(data: String) { // ... aktualizujeme UI alebo ukladáme údaje } -
Fragment Result API: Moderný spôsob odovzdávania výsledkov medzi fragmentmi, predstavený vo verzii 1.3.0 AndroidX Fragment.
// Vo vysielajúcom fragmente setFragmentResult("requestKey", bundleOf("bundleKey" to "výsledok")) // Vo prijímajúcom fragmente setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... používame výsledok }