Çalışma zamanında, FragmentManager
, kullanıcı etkileşimine yanıt olarak parçalarla ekleme, kaldırma, değiştirme ve başka işlemler gerçekleştirebilir. Taahhüt ettiğiniz her bir parça değişikliği grubuna işlem denir. FragmentTransaction
sınıfı tarafından sağlanan API'leri kullanarak işlem içinde ne yapılacağını belirtebilirsiniz. Birden fazla işlemi tek bir işlemde gruplandırabilirsiniz. Örneğin, bir işlem birden fazla parça ekleyebilir veya değiştirebilir. Bu gruplandırma, bölünmüş görünümler gibi aynı ekranda birden fazla eşdüzey parça görüntülendiğinde yararlı olabilir.
Her işlemi FragmentManager
tarafından yönetilen bir geri yığına kaydedebilirsiniz. Böylece kullanıcı, etkinlikler arasında geriye doğru gezinmeye benzer şekilde, parça değişiklikleri arasında geriye doğru gezinebilir.
Aşağıdaki örnekte gösterildiği gibi beginTransaction()
işlevini çağırarak FragmentManager
sınıfından bir FragmentTransaction
örneği alabilirsiniz:
Kotlin
val fragmentManager = ... val fragmentTransaction = fragmentManager.beginTransaction()
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Her FragmentTransaction
için son çağrı, işlemi taahhüt etmelidir.
commit()
çağrısı, tüm işlemlerin işleme eklendiğini FragmentManager
'ye bildirir.
Kotlin
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit { // Add operations here }
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // Add operations here fragmentTransaction.commit();
Parça durumu değişikliklerinin yeniden sıralanmasına izin verme
Her FragmentTransaction
, setReorderingAllowed(true)
kullanmalıdır:
Kotlin
supportFragmentManager.commit { ... setReorderingAllowed(true) }
Java
FragmentManager fragmentManager = ... fragmentManager.beginTransaction() ... .setReorderingAllowed(true) .commit();
Davranış uyumluluğu için yeniden sıralama işareti varsayılan olarak etkin değildir.
Ancak FragmentManager
'ün, özellikle arka yığınta çalışırken ve animasyonlar ile geçişler yürütürken FragmentTransaction
'unuzu düzgün şekilde yürütmesine izin vermeniz gerekir. İşaretin etkinleştirilmesi, birden fazla işlem birlikte yürütüldüğünde ara parçaların (yani eklenen ve hemen değiştirilen parçalar) yaşam döngüsü değişikliklerine uğramamasını veya animasyonlarının ya da geçişlerinin yürütülmesini sağlar. Bu işaretin hem işlemin ilk yürütülmesini hem de popBackStack()
ile işlemi geri almasını etkilediğini unutmayın.
Kırıntı ekleme ve kaldırma
Bir FragmentManager
öğesine parça eklemek için işlemde add()
işlevini çağırın. Bu yöntem, parçanın kapsayıcısının kimliğini ve eklemek istediğiniz parçanın sınıf adını alır. Eklenen parça, RESUMED
durumuna taşınır. Kapsayıcı'nın, görünüm hiyerarşisinin bir parçası olan bir FragmentContainerView
olması önemle tavsiye edilir.
Bir fragmanı ana makineden kaldırmak için remove()
'i çağırın ve findFragmentById()
veya findFragmentByTag()
aracılığıyla segment yöneticisinden alınan bir segment örneğini iletin.
Parçanın görünümü daha önce bir kapsayıcıya eklenmişse görünüm bu noktada kapsayıcıdan kaldırılır. Kaldırılan parça DESTROYED
durumuna taşınır.
Bir kapsayıcıdaki mevcut bir parçayı, sağladığınız yeni bir parça sınıfının örneğiyle değiştirmek için replace()
kullanın. replace()
çağrısı, bir kapsayıcıdaki bir parçayla remove()
çağrısı yapmak ve aynı kapsayıcıya yeni bir parça eklemek ile aynıdır.
Aşağıdaki kod snippet'inde, bir parçayı başka bir parçayla nasıl değiştirebileceğiniz gösterilmektedir:
Kotlin
// Create new fragment val fragmentManager = // ... // Create and commit a new transaction fragmentManager.commit { setReorderingAllowed(true) // Replace whatever is in the fragment_container view with this fragment replace<ExampleFragment>(R.id.fragment_container) }
Java
// Create new fragment and transaction FragmentManager fragmentManager = ... FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setReorderingAllowed(true); // Replace whatever is in the fragment_container view with this fragment transaction.replace(R.id.fragment_container, ExampleFragment.class, null); // Commit the transaction transaction.commit();
Bu örnekte, R.id.fragment_container
ile tanımlanan düzen kapsayıcısında bulunan (varsa) parçanın yerine yeni bir ExampleFragment
örneği getirilir.
Varsayılan olarak, FragmentTransaction
içinde yapılan değişiklikler arka yığına eklenmez. Bu değişiklikleri kaydetmek için FragmentTransaction
'da addToBackStack()
düğmesine basabilirsiniz. Daha fazla bilgi için Bölüntü yöneticisi başlıklı makaleyi inceleyin.
Kayıt işlemi eşzamansızdır.
commit()
çağrısı, işlemi hemen gerçekleştirmez. Bunun yerine, işlem mümkün olduğu anda ana kullanıcı arayüzü iş parçacığında çalışacak şekilde planlandı. Ancak gerekirse kullanıcı arayüzü iş parçacığınızda parça işlemini hemen çalıştırmak için commitNow()
öğesini çağırabilirsiniz.
commitNow
, addToBackStack
ile uyumlu değildir. Alternatif olarak, commit()
tarafından gönderilen ve henüz yayınlanmamış tüm bekleyen FragmentTransactions
'leri executePendingTransactions()
arayarak yürütebilirsiniz. Bu yaklaşım addToBackStack
ile uyumludur.
Kullanım alanlarının büyük çoğunluğu için ihtiyacınız olan tek şey commit()
.
İşlem sıralaması önemlidir
FragmentTransaction
içinde işlemleri gerçekleştirdiğiniz sıra, özellikle setCustomAnimations()
kullanırken önemlidir. Bu yöntem, belirli animasyonları onu izleyen tüm parça işlemlerine uygular.
Kotlin
supportFragmentManager.commit { setCustomAnimations(enter1, exit1, popEnter1, popExit1) add<ExampleFragment>(R.id.container) // gets the first animations setCustomAnimations(enter2, exit2, popEnter2, popExit2) add<ExampleFragment>(R.id.container) // gets the second animations }
Java
getSupportFragmentManager().beginTransaction() .setCustomAnimations(enter1, exit1, popEnter1, popExit1) .add(R.id.container, ExampleFragment.class, null) // gets the first animations .setCustomAnimations(enter2, exit2, popEnter2, popExit2) .add(R.id.container, ExampleFragment.class, null) // gets the second animations .commit()
Kırıntı yaşam döngüsünü sınırlama
FragmentTransactions
, işlemin kapsamına eklenen bağımsız parçaların yaşam döngüsü durumunu etkileyebilir. Bir FragmentTransaction
oluştururken setMaxLifecycle()
, söz konusu parça için maksimum durum ayarlar. Örneğin, ViewPager2
, ekran dışı parçaları STARTED
durumuna sınırlamak için setMaxLifecycle()
kullanır.
Parçanın görünümlerini gösterme ve gizleme
Bir kapsayıcıya eklenen parçaların görünümünü göstermek ve gizlemek için FragmentTransaction
yöntemlerinishow()
ve
hide()
kullanın.
Bu yöntemler, fragmentin yaşam döngüsünü etkilemeden fragmentin görünümlerinin görünürlüğünü belirler.
Bir fragmandaki görünümlerin görünürlüğünü değiştirmek için fragman işlemi kullanmanız gerekmese de bu yöntemler, görünürlük durumundaki değişikliklerin arka yığıntaki işlemlerle ilişkilendirilmesini istediğiniz durumlarda kullanışlıdır.
Parçaları ekleme ve kaldırma
FragmentTransaction
yöntemi detach()
, parçayı kullanıcı arayüzünden ayırarak görünüm hiyerarşisini yok eder. Parça, arka yığına konulduğundaki durumda (STOPPED
) kalır.
Bu, parçanın kullanıcı arayüzünden kaldırıldığı ancak parça yöneticisi tarafından yönetilmeye devam ettiği anlamına gelir.
attach()
yöntemi, daha önce ayrılmış bir parçayı yeniden bağlar.
Bu işlem, görünüm hiyerarşisinin yeniden oluşturulmasına, kullanıcı arayüzüne eklenmesine ve görüntülenmesine neden olur.
FragmentTransaction
tek bir atomik işlem grubu olarak değerlendirildiğinden, aynı işlemdeki aynı parça örneğinde hem detach
hem de attach
çağrıları birbirini etkili bir şekilde iptal eder. Böylece, parçanın kullanıcı arayüzünün kaldırılması ve hemen yeniden oluşturulması önlenir. Bir parçayı ayırıp hemen yeniden eklemek istiyorsanız ayrı işlemler kullanın. commit()
kullanıyorsanız işlemler executePendingOperations()
ile ayrılmalıdır.