Sobes.tech
Middle

Фрагменттер арасында маалыматтарды өткөрүүнүн бардык жолдорун тизмектеңиз.

sobes.tech AI

AIден жооп

  1. Бандл аргументтери: Эң кеңири тараган ыкма. Маалыматтар 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")
        // ... маанини колдонуу
    }
    
  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 ->
        // ... маалыматтарды колдонуу
    }
    
  3. Кайтаруу интерфейстер: Фрагмент интерфейс аныктай алат, аны активдештирүүчү ишке ашырат. Фрагмент бул интерфейс методдорун чакырып, маалыматтарды активдештирүүгө жиберет, ал эми ал кийинчерээк башка фрагментке өткөрө алат.

    // Жөнөтүүчү фрагментте интерфейс
    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 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 ыкмасы бар деп болжонууда
        }
    }
    
    // Алып жаткан фрагмент
    fun updateData(data: String) {
        // ... UI жаңыртуу же маалымат сактоо
    }
    
  4. Fragment Result API: Modern ыкма фрагменттер ортосундагы натыйжаларды өткөрүү үчүн, AndroidX Fragment версиясы 1.3.0да киргизилген.

    // Жөнөтүүчү фрагментте
    setFragmentResult("requestKey", bundleOf("bundleKey" to "жыйынтык"))
    
    // Алып жаткан фрагментте
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... натыйжаны колдонуу
    }