Sobes.tech
Middle

Nennen Sie alle Möglichkeiten der Datenübertragung zwischen Fragmenten.

sobes.tech KI

Antwort von AI

  1. Bundle-Argumente: Die gebräuchlichste Methode. Daten werden als Bundle über die Methode setArguments() des Fragments übergeben.

    // Im sendenden Fragment
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... Übergang zu TargetFragment
    
    // Im empfangenden Fragment
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... Wert verwenden
    }
    
  2. Shared ViewModel: Wird verwendet, um Daten zu übertragen, die mit dem Lebenszyklus der Aktivität oder mehrerer Fragmente verbunden sind.

    // Im ViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // In beiden Fragmenten
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // Im sendenden Fragment
    sharedViewModel.data.value = "zu übertragende Daten"
    
    // Im empfangenden Fragment
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... Daten verwenden
    }
    
  3. Callback-Interfaces: Das Fragment kann eine Schnittstelle definieren, die die Aktivität implementiert. Das Fragment ruft die Methoden dieser Schnittstelle auf und übergibt Daten an die Aktivität, die sie dann an ein anderes Fragment weitergeben kann.

    // Schnittstelle im sendenden Fragment
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Sendendes Fragment
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context muss OnDataPass implementieren")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Aktivität
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Annahme: TargetFragment hat die Methode updateData
        }
    }
    
    // Empfangendes Fragment
    fun updateData(data: String) {
        // ... UI aktualisieren oder Daten speichern
    }
    
  4. Fragment-Ergebnis-API: Moderner Weg, um Ergebnisse zwischen Fragmenten zu übertragen, eingeführt in AndroidX Fragment Version 1.3.0.

    // Im sendenden Fragment
    setFragmentResult("requestKey", bundleOf("bundleKey" to "Ergebnis"))
    
    // Im empfangenden Fragment
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... Ergebnis verwenden
    }