Sobes.tech
Middle

Navedite sve načine prenosa podataka između fragmenata.

sobes.tech АИ

Одговор од АИ

  1. Argumenti paketa: Najčešći način. Podaci se prosleđuju u obliku Bundle putem metode setArguments() fragmenta.

    // U fragmentu-pošiljaocu
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... prelaz na TargetFragment
    
    // U fragmentu-primaocu
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... koristimo vrednost
    }
    
  2. Shared ViewModel: Koristi se za prenos podataka povezanih sa životnim ciklusom aktivnosti ili više fragmenata.

    // U ViewModel-u
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // U oba fragmenta
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // U fragmentu-pošiljaocu
    sharedViewModel.data.value = "prosleđeni podaci"
    
    // U fragmentu-primaocu
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... koristimo podatke
    }
    
  3. Interfejsi za povratni poziv: Fragment može definisati interfejs koji implementira aktivnost. Fragment poziva metode tog interfejsa, prosleđujući podatke aktivnosti, koja ih zatim može proslediti drugom fragmentu.

    // Interfejs u fragmentu-pošiljaocu
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Fragment-pošiljalac
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context mora implementirati OnDataPass")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Aktivnost
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Pretpostavlja se metoda updateData u TargetFragment
        }
    }
    
    // Fragment-primaoc
    fun updateData(data: String) {
        // ... ažuriramo UI ili čuvamo podatke
    }
    
  4. Fragment Result API: Moderni način prenosa rezultata između fragmenata, predstavljen u AndroidX Fragment verziji 1.3.0.

    // U fragmentu-pošiljaocu
    setFragmentResult("requestKey", bundleOf("bundleKey" to "rezultat"))
    
    // U fragmentu-primaocu
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... koristimo rezultat
    }