Middle
Enumerați toate modalitățile de transfer de date între fragmente.
sobes.tech AI
Răspuns de la AI
-
Argumente ale Bundle-ului: Cea mai comună metodă. Datele sunt transmise sub formă de Bundle prin metoda
setArguments()a fragmentului.// În fragmentul emițător val bundle = Bundle() bundle.putString("key", "value") val targetFragment = TargetFragment() targetFragment.arguments = bundle // ... tranziție către TargetFragment // În fragmentul receptor override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... folosim value } -
ViewModel partajat: Folosit pentru a transmite date legate de ciclul de viață al activității sau al mai multor fragmente.
// În ViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // În ambele fragmente private val sharedViewModel: SharedViewModel by activityViewModels() // În fragmentul emițător sharedViewModel.data.value = "date de transmis" // În fragmentul receptor sharedViewModel.data.observe(viewLifecycleOwner) { data -> // ... folosim data } -
Interfețe de callback: Fragmentul poate defini o interfață pe care o implementează activitatea. Fragmentul apelează metodele acestei interfețe, transmitând date către activitate, care le poate transmite apoi altui fragment.
// Interfață în fragmentul emițător interface OnDataPass { fun onDataPass(data: String) } // Fragment emițător private var dataPasser: OnDataPass? = null override fun onAttach(context: Context) { super.onAttach(context) if (context is OnDataPass) { dataPasser = context } else { throw RuntimeException("$context trebuie să implementeze OnDataPass") } } fun passData(data: String) { dataPasser?.onDataPass(data) } // Activitate class MainActivity : AppCompatActivity(), OnDataPass { override fun onDataPass(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment targetFragment?.updateData(data) // Presupune că TargetFragment are metoda updateData } } // Fragment receptor fun updateData(data: String) { // ... actualizează UI sau salvează data } -
API-ul de rezultate al fragmentului: Mod modern de a transmite rezultate între fragmente, introdus în versiunea 1.3.0 a AndroidX Fragment.
// În fragmentul emițător setFragmentResult("requestKey", bundleOf("bundleKey" to "rezultat")) // În fragmentul receptor setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... folosim result }