Sobes.tech
Middle

Wymień wszystkie sposoby przesyłania danych między fragmentami.

sobes.tech AI

Odpowiedź od AI

  1. Argumenty Bundle: Najczęstszy sposób. Dane są przekazywane w formie Bundle za pomocą metody setArguments() fragmentu.

    // W fragmencie nadawczym
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... przejście do TargetFragment
    
    // W fragmencie odbiorczym
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... używamy value
    }
    
  2. Wspólny ViewModel: Używany do przekazywania danych związanych z cyklem życia aktywności lub kilku fragmentów.

    // W ViewModel
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // W obu fragmentach
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // W fragmencie nadawczym
    sharedViewModel.data.value = "dane do przekazania"
    
    // W fragmencie odbiorczym
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... używamy data
    }
    
  3. Interfejsy zwrotne: Fragment może zdefiniować interfejs, który implementuje aktywność. Fragment wywołuje metody tego interfejsu, przekazując dane do aktywności, która może je następnie przekazać innemu fragmentowi.

    // Interfejs w fragmencie nadawczym
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Fragment nadawczy
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context musi implementować OnDataPass")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Aktywność
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Zakłada się, że TargetFragment ma metodę updateData
        }
    }
    
    // Fragment odbiorczy
    fun updateData(data: String) {
        // ... aktualizacja UI lub zapis danych
    }
    
  4. API Wyniku Fragmentu: Nowoczesny sposób przekazywania wyników między fragmentami, wprowadzony w AndroidX Fragment wersja 1.3.0.

    // W fragmencie nadawczym
    setFragmentResult("requestKey", bundleOf("bundleKey" to "wynik"))
    
    // W fragmencie odbiorczym
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... używamy result
    }