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:
-
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.
-
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.
-
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.