Junior
Как да прехвърляме данни от един фрагмент към друг?
sobes.tech AI
Отговор от AI
-
Аргументи на 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") // ... използване на стойността } -
Споделен 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 -> // ... използване на стойността } -
Използване на интерфейс за обратно извикване: Един фрагмент извиква метод в 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 с данните } -
API за резултати на фрагмент: Модерен и препоръчителен начин за обмен на данни между фрагменти.
// В изходящия фрагмент (установяване на резултата) setFragmentResult("requestKey", bundleOf("bundleKey" to "value")) // В приемащия фрагмент (слушане на резултата) setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... използване на резултата }