Sobes.tech
Junior

Fragmentdən fəaliyyət metodunu necə çağırmaq olar?

sobes.tech Süni İntellekt

AI-dan cavab

Fəaliyyət metodunu fragmentdən çağırmaq üçün müxtəlif yollar var, vəziyyət və memarlıqdan asılı olaraq:

  1. Fəaliyyətə birbaşa istinad vasitəsilə:

    Fragment ona qoşulmuş fəaliyyətə birbaşa istinad əldə edə bilər.

    // Fragment daxilində
    if (activity is YourActivity) {
        (activity as YourActivity).yourActivityMethod()
    }
    

    Bu üsul sadədir, lakin fragment və konkret fəaliyyət arasında güclü asılılıq yaradır.

  2. Geri çağırış interfeysi vasitəsilə:

    Bu daha çevik və tövsiyə olunan yoldur. Fragmentdə interfeys müəyyən edilir və fəaliyyət onu həyata keçirməlidir.

    // Fragment daxilində
    interface OnYourActivityMethodListener {
        fun onYourActivityMethodCalled()
    }
    
    private var listener: OnYourActivityMethodListener? = null
    
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnYourActivityMethodListener) {
            listener = context
        } else {
            throw RuntimeException("$context OnYourActivityMethodListener-i həyata keçirməlidir")
        }
    }
    
    override fun onDetach() {
        super.onDetach()
        listener = null
    }
    
    // Fragmentdən fəaliyyət metodunu çağırmaq
    fun callActivityMethod() {
        listener?.onYourActivityMethodCalled()
    }
    
    // Fəaliyyətdə
    class YourActivity : AppCompatActivity(), YourFragment.OnYourActivityMethodListener {
    
        override fun onYourActivityMethodCalled() {
            // Fəaliyyətdə icra olunmalı loqika
        }
    
        // ... digər fəaliyyət kodu
    }
    

    Bu yanaşma fragmenti daha təkrar istifadə edilə bilən edir, çünki o, konkret fəaliyyət sinifindən deyil, müqavilə (interfeys) əsasında asılıdır.

  3. ViewModel vasitəsilə (daha mürəkkəb qarşılıqlı əlaqələr üçün tövsiyə olunur):

    Fragment və fəaliyyət arasında ümumi ViewModel istifadə etmək, birbaşa istinadlar olmadan məlumat və hadisələri mübadilə etməyə imkan verir.

    // Ümumi ViewModel
    class SharedViewModel : ViewModel() {
        private val _callActivityMethodEvent = MutableLiveData<Event<Unit>>()
        val callActivityMethodEvent: LiveData<Event<Unit>> = _callActivityMethodEvent
    
        fun triggerActivityMethod() {
            _callActivityMethodEvent.value = Event(Unit)
        }
    }
    
    // Hadisə üçün LiveData-nı idarə edən sarmalayıcı sinif
    open class Event<out T>(private val content: T) {
        var hasBeenHandled = false
            private set // Xaricdən oxumağa imkan verir, yazmağa yox
    
        /**
         * Məzmunu qaytarır və yenidən istifadə edilməsini qarşısını alır.
         */
        fun getContentIfNotHandled(): T? {
            return if (hasBeenHandled) {
                null
            } else {
                hasBeenHandled = true
                content
            }
        }
    
        /**
         * Məzmunu, hətta artıq işlənibsə belə, qaytarır.
         */
        fun peekContent(): T = content
    }
    
    // Fragment daxilində
    private val sharedViewModel: SharedViewModel by activityViewModels() // activityViewModels() istifadə edir
    
    // ViewModel vasitəsilə fəaliyyət metodunu çağırmaq
    fun callActivityMethod() {
        sharedViewModel.triggerActivityMethod()
    }
    
    // Fəaliyyətdə
    private val sharedViewModel: SharedViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
    
        sharedViewModel.callActivityMethodEvent.observe(this, Observer { event ->
            event.getContentIfNotHandled()?.let {
                // Fəaliyyətdə icra olunmalı loqika
            }
        })
    }
    

    Bu yanaşma memarlıq komponentlərinin tövsiyələrinə uyğundur və test etməyi asanlaşdırır.

Yöntem seçimi qarşılıqlı əlaqənin mürəkkəbliyindən asılıdır. Sadə hallarda birbaşa çağırış və ya interfeys kifayət edir. Daha mürəkkəb ssenarilər üçün, xüsusən məlumatların ötürülməsi ilə əlaqəli, ViewModel istifadə etmək üstünlük təşkil edir.