Sobes.tech
Middle

Καταγράψτε όλους τους τρόπους μεταφοράς δεδομένων μεταξύ των τμημάτων.

sobes.tech AI

Απάντηση από AI

  1. Ορισμοί Bundle: Ο πιο συνηθισμένος τρόπος. Τα δεδομένα μεταβιβάζονται ως Bundle μέσω της μεθόδου setArguments() του τμήματος.

    // Στο αποστολέα τμήμα
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... μετάβαση στο TargetFragment
    
    // Στο λήπτη τμήμα
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... χρήση της τιμής
    }
    
  2. Κοινόχρηστο ViewModel: Χρησιμοποιείται για τη μεταφορά δεδομένων που σχετίζονται με τον κύκλο ζωής της δραστηριότητας ή πολλών τμημάτων.

    // Στο ViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // Στα δύο τμήματα
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // Στο αποστολέα τμήμα
    sharedViewModel.data.value = "δεδομένα προς μεταφορά"
    
    // Στο λήπτη τμήμα
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... χρήση δεδομένων
    }
    
  3. Διεπαφές Callback: Το τμήμα μπορεί να ορίσει μια διεπαφή που υλοποιείται από τη δραστηριότητα. Το τμήμα καλεί τις μεθόδους αυτής της διεπαφής, περνώντας δεδομένα στη δραστηριότητα, η οποία μπορεί στη συνέχεια να τα μεταφέρει σε άλλο τμήμα.

    // Διεπαφή στο αποστολέα τμήμα
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Αποστολέας τμήμα
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context πρέπει να υλοποιεί OnDataPass")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Δραστηριότητα
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Υποθέτουμε ότι το TargetFragment έχει τη μέθοδο updateData
        }
    }
    
    // Λήπτης τμήμα
    fun updateData(data: String) {
        // ... ενημέρωση UI ή αποθήκευση δεδομένων
    }
    
  4. API Αποτελεσμάτων Τμήματος: Σύγχρονος τρόπος μεταφοράς αποτελεσμάτων μεταξύ τμημάτων, εισήχθη στην έκδοση 1.3.0 του AndroidX Fragment.

    // Στο αποστολέα τμήμα
    setFragmentResult("requestKey", bundleOf("bundleKey" to "αποτέλεσμα"))
    
    // Στο λήπτη τμήμα
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... χρήση αποτελέσματος
    }