Junior
89
questionbank
Как передавать данные из одного фрагмента в другой?
Answer from AI
sobes.tech AI
-
Bundle Arguments: Используется для передачи примитивных типов данных и объектов, реализующих
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") // ... использование value } -
Shared 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 -> // ... использование value } -
Using interface callback: Один фрагмент вызывает метод в 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 с данными } -
Fragment Result API: Современный и рекомендованный способ для обмена данными между фрагментами.
// В отправляющем фрагменте (устанавливаем результат) setFragmentResult("requestKey", bundleOf("bundleKey" to "value")) // В принимающем фрагменте (слушаем результат) setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... использование result }