Sobes.tech
Middle

Նշեք տվյալների փոխանցման բոլոր եղանակները հատվածների միջև։

sobes.tech AI

Պատասխան AI-ից

  1. Բանդլի պնդումներ: Ամենատարածված մեթոդը: Տվյալները փոխանցվում են 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 ինտերֆեյսներ: Ֆրագմենտը կարող է սահմանել ինտերֆեյս, որը իրականացնում է ակտիվությունը: Ֆրագմենտը կանչում է այդ ինտերֆեյսի մեթոդները, փոխանցելով տվյալները ակտիվությանը, որը կարող է փոխանցել դրանք մյուս ֆրագմենտին:

    // Ինտերֆեյսը ուղարկող ֆրագմենտում
    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: Ժամանակակից մեթոդ արդյունքների փոխանցման համար ֆրագմենտների միջև, ներկայացված AndroidX Fragment 1.3.0 տարբերակում:

    // Ուղարկող ֆրագմենտում
    setFragmentResult("requestKey", bundleOf("bundleKey" to "արդյունք"))
    
    // Ստացող ֆրագմենտում
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        val result = bundle.getString("bundleKey")
        // ... օգտագործում ենք արդյունքը
    }