Назад к вопросам
Middle
72
questionbank
Перечислите все способы передачи данных между фрагментами.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
-
Bundle arguments: Самый распространенный способ. Данные передаются в виде 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") // ... используем value } -
Shared ViewModel: Используется для передачи данных, связанных с жизненным циклом активности или нескольких фрагментов.
// В ViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // В обоих фрагментах private val sharedViewModel: SharedViewModel by activityViewModels() // Во фрагменте-отправителе sharedViewModel.data.value = "передаваемые данные" // Во фрагменте-получателе sharedViewModel.data.observe(viewLifecycleOwner) { data -> // ... используем data } -
Callback Interfaces: Фрагмент может определить интерфейс, который реализует активность. Фрагмент вызывает методы этого интерфейса, передавая данные в активность, которая затем может передать их другому фрагменту.
// Интерфейс во фрагменте-отправителе 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 must implement 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) // Предполагается метод updateData в TargetFragment } } // Фрагмент-получатель fun updateData(data: String) { // ... обновляем UI или сохраняем data } -
Fragment Result API: Современный способ передачи результатов между фрагментами, представленный в AndroidX Fragment версии 1.3.0.
// Во фрагменте-отправителе setFragmentResult("requestKey", bundleOf("bundleKey" to "результат")) // Во фрагменте-получателе setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... используем result }