Sobes.tech
Junior

Как да прехвърляме данни от един фрагмент към друг?

sobes.tech AI

Отговор от AI

  1. Аргументи на Bundle: Използват се за предаване на примитивни типове данни и обекти, реализиращи Parcelable или Serializable, при създаване на нов екземпляр на фрагмент.

    // В изходящия фрагмент
    val bundle = Bundle().apply {
        putString("key", "value")
    }
    val fragment = TargetFragment().apply {
        arguments = bundle
    }
    
    // В приемащия фрагмент
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... използване на стойността
    }
    
  2. Споделен ViewModel: Фрагменти, принадлежащи към една и съща Activity, могат да използват споделен ViewModel за обмен на данни.

    // SharedViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // В изходящия фрагмент
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.value = "value"
    
    // В приемащия фрагмент
    private val sharedViewModel: SharedViewModel by activityViewModels()
    sharedViewModel.data.observe(viewLifecycleOwner) { value ->
        // ... използване на стойността
    }
    
  3. Използване на интерфейс за обратно извикване: Един фрагмент извиква метод в Activity, а Activity след това извиква метод в друг фрагмент.

    // Интерфейс в Activity или в отделен файл
    interface DataTransferListener {
        fun onDataReceived(data: String)
    }
    
    // В изходящия фрагмент
    (activity as? DataTransferListener)?.onDataReceived("value")
    
    // В Activity, реализираща интерфейса
    override fun onDataReceived(data: String) {
        val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment_container) as? TargetFragment
        targetFragment?.updateUI(data)
    }
    
    // В приемащия фрагмент
    fun updateUI(data: String) {
        // ... актуализиране на UI с данните
    }
    
  4. API за резултати на фрагмент: Модерен и препоръчителен начин за обмен на данни между фрагменти.

    // В изходящия фрагмент (установяване на резултата)
    setFragmentResult("requestKey", bundleOf("bundleKey" to "value"))
    
    // В приемащия фрагмент (слушане на резултата)
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... използване на резултата
    }