Sobes.tech
Middle

Išvardinkite visus duomenų perdavimo būdus tarp fragmentų.

sobes.tech AI

Atsakymas iš AI

  1. Rinkinys argumentai: Dažniausias būdas. Duomenys perduodami kaip Bundle per setArguments() metodą fragmento.

    // Siunčiančio fragmento viduje
    val bundle = Bundle()
    bundle.putString("key", "value")
    val targetFragment = TargetFragment()
    targetFragment.arguments = bundle
    // ... pereiti prie TargetFragment
    
    // Gavusio fragmento viduje
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val value = arguments?.getString("key")
        // ... naudojame reikšmę
    }
    
  2. Shared ViewModel: Naudojamas duomenų perdavimui, susijusiam su aktyvumo ar kelių fragmentų gyvavimo ciklu.

    // ViewModel'e
    class SharedViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
    
    // Abiejuose fragmentuose
    private val sharedViewModel: SharedViewModel by activityViewModels()
    
    // Siunčiančio fragmento viduje
    sharedViewModel.data.value = "perduodami duomenys"
    
    // Gavusio fragmento viduje
    sharedViewModel.data.observe(viewLifecycleOwner) { data ->
        // ... naudojame duomenis
    }
    
  3. Atgalinio ryšio sąsajos: Fragmentas gali apibrėžti sąsają, kurią įgyvendina aktyvumas. Fragmentas kviečia šios sąsajos metodus, perduodamas duomenis aktyvumui, kuris tada gali juos perduoti kitam fragmentui.

    // Sąsaja siuntimo fragmente
    interface OnDataPass {
        fun onDataPass(data: String)
    }
    
    // Siuntimo fragmentas
    private var dataPasser: OnDataPass? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnDataPass) {
            dataPasser = context
        } else {
            throw RuntimeException("$context turi įgyvendinti OnDataPass")
        }
    }
    
    fun passData(data: String) {
        dataPasser?.onDataPass(data)
    }
    
    // Veikla
    class MainActivity : AppCompatActivity(), OnDataPass {
        override fun onDataPass(data: String) {
            val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment
            targetFragment?.updateData(data) // Tikimasi, kad yra updateData metodas TargetFragment'e
        }
    }
    
    // Priimantis fragmentas
    fun updateData(data: String) {
        // ... atnaujinti UI arba išsaugoti duomenis
    }
    
  4. Fragment Result API: Šiuolaikinis būdas perduoti rezultatus tarp fragmentų, pristatytas AndroidX Fragment versijoje 1.3.0.

    // Siunčiančiame fragmente
    setFragmentResult("requestKey", bundleOf("bundleKey" to "rezultatas"))
    
    // Priimančiame fragmente
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... naudoti rezultatą
    }