Sobes.tech
Junior

Jak przekazywać dane z jednego fragmentu do drugiego?

sobes.tech AI

Odpowiedź od AI

  1. Argumenty Bundle: Używane do przekazywania typów danych prostych i obiektów implementujących Parcelable lub Serializable podczas tworzenia nowej instancji fragmentu.

    // W fragmencie wysyłającym
    val bundle = Bundle().apply {
        putString("key", "value")
    }
    val fragment = TargetFragment().apply {
        arguments = bundle
    }
    
    // W fragmencie odbierającym
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... użycie value
    }
    
  2. Wspólny ViewModel: Fragmenty należące do tej samej Activity mogą korzystać z wspólnego ViewModel do wymiany danych.

    // SharedViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // W fragmencie wysyłającym
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.value = "value"
    
    // W fragmencie odbierającym
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.observe(viewLifecycleOwner) { value ->
        // ... użycie value
    }
    
  3. Użycie interfejsu zwrotnego: Jeden fragment wywołuje metodę w Activity, a Activity następnie wywołuje metodę w innym fragmencie.

    // Interfejs w Activity lub w osobnym pliku
    interface DataTransferListener {
        fun onDataReceived(data: String)
    }
    
    // W fragmencie wysyłającym
    (activity as? DataTransferListener)?.onDataReceived("value")
    
    // W Activity implementującej interfejs
    override fun onDataReceived(data: String) {
        val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment
        targetFragment?.updateUI(data)
    }
    
    // W fragmencie odbierającym
    fun updateUI(data: String) {
        // ... aktualizacja UI z danymi
    }
    
  4. API wyników fragmentu: Nowoczesny i zalecany sposób wymiany danych między fragmentami.

    // W fragmencie wysyłającym (ustawianie wyniku)
    setFragmentResult("requestKey", bundleOf("bundleKey" to "value"))
    
    // W fragmencie odbierającym (nasłuchiwanie wyniku)
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... użycie wyniku
    }