Sobes.tech
Middle

Noem alle manieren van gegevensoverdracht tussen fragmenten.

sobes.tech AI

Antwoord van AI

  1. Bundle-argumenten: De meest gebruikte methode. Gegevens worden als Bundle doorgegeven via de methode setArguments() van het fragment.

    // In het verzendende fragment
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... overgang naar TargetFragment
    
    // In het ontvangende fragment
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... gebruik value
    }
    
  2. Shared ViewModel: Wordt gebruikt om gegevens over te dragen die gerelateerd zijn aan de levenscyclus van de activiteit of meerdere fragmenten.

    // In het ViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // In beide fragmenten
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // In het verzendende fragment
    sharedViewModel.data.value = "gegevens om over te dragen"
    
    // In het ontvangende fragment
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... gebruik data
    }
    
  3. Callback-interfaces: Het fragment kan een interface definiëren die de activiteit implementeert. Het fragment roept de methoden van deze interface aan, waarbij gegevens worden doorgegeven aan de activiteit, die ze vervolgens aan een ander fragment kan doorgeven.

    // Interface in het verzendende fragment
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Verzendend fragment
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context moet OnDataPass implementeren")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Activiteit
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Veronderstelt dat TargetFragment een updateData-methode heeft
        }
    }
    
    // Ontvangend fragment
    fun updateData(data: String) {
        // ... UI bijwerken of data opslaan
    }
    
  4. Fragment Result API: Moderne manier om resultaten tussen fragmenten over te dragen, geïntroduceerd in AndroidX Fragment versie 1.3.0.

    // In het verzendende fragment
    setFragmentResult("requestKey", bundleOf("bundleKey" to "resultaat"))
    
    // In het ontvangende fragment
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... gebruik result
    }