Sobes.tech
Middle

Избройте всички начини за прехвърляне на данни между фрагменти.

sobes.tech AI

Отговор от AI

  1. Аргументи на Bundle: Най-често срещаният начин. Данните се предават като 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")
        // ... използваме стойността
    }
    
  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 в TargetFragment
        }
    }
    
    // Приемащ фрагмент
    fun updateData(data: String) {
        // ... актуализиране на UI или запазване на данни
    }
    
  4. Fragment Result API: Модерен начин за предаване на резултати между фрагменти, представен във версия 1.3.0 на AndroidX Fragment.

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