Sobes.tech
Junior

Kako preneti podatke iz jednog fragmenta u drugi?

sobes.tech АИ

Одговор од АИ

  1. Argumenti paketa: Koristi se za prenos primitivnih tipova podataka i objekata koji implementiraju Parcelable ili Serializable, prilikom kreiranja novog primera fragmenta.

    // U fragmentu koji šalje
    val bundle = Bundle().apply {
        putString("key", "value")
    }
    val fragment = TargetFragment().apply {
        arguments = bundle
    }
    
    // U fragmentu koji prima
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... korišćenje value
    }
    
  2. Shared ViewModel: Fragmenti koji pripadaju istoj Activity mogu koristiti zajednički ViewModel za razmenu podataka.

    // SharedViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // U fragmentu koji šalje
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.value = "value"
    
    // U fragmentu koji prima
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.observe(viewLifecycleOwner) { value ->
        // ... korišćenje value
    }
    
  3. Korišćenje interfejs callback-a: Jedan fragment poziva metodu u Activity, a Activity zatim poziva metodu u drugom fragmentu.

    // Interfejs u Activity ili posebnoj datoteci
    interface DataTransferListener {
        fun onDataReceived(data: String)
    }
    
    // U fragmentu koji šalje
    (activity as? DataTransferListener)?.onDataReceived("value")
    
    // U Activity-ju koji implementira interfejs
    override fun onDataReceived(data: String) {
        val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment
        targetFragment?.updateUI(data)
    }
    
    // U fragmentu koji prima
    fun updateUI(data: String) {
        // ... ažuriranje UI sa podacima
    }
    
  4. Fragment Result API: Savremeni i preporučeni način za razmenu podataka između fragmenata.

    // U fragmentu koji šalje (postavljamo rezultat)
    setFragmentResult("requestKey", bundleOf("bundleKey" to "value"))
    
    // U fragmentu koji prima (slušamo rezultat)
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... korišćenje result
    }