Назад к вопросам
Middle
72
questionbank

Перечислите все способы передачи данных между фрагментами.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  1. 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
    }
    
  2. 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
    }
    
  3. 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
    }
    
  4. Fragment Result API: Современный способ передачи результатов между фрагментами, представленный в AndroidX Fragment версии 1.3.0.

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