Sobes.tech
Middle

Enumerați toate modalitățile de transfer de date între fragmente.

sobes.tech AI

Răspuns de la AI

  1. 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
    }
    
  2. 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
    }
    
  3. 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
    }
    
  4. 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
    }