Çalışma zamanında FragmentManager
, kullanıcı etkileşimine yanıt olarak parçalarla başka işlemler ekleyebilir, kaldırabilir, değiştirebilir ve gerçekleştirebilir. Gerçekleştirdiğiniz her parça değişikliği grubuna işlem adı verilir. FragmentTransaction
sınıfı tarafından sağlanan API'leri kullanarak işlem içinde ne yapılacağını belirtebilirsiniz. Birden çok işlemi tek bir işlem altında gruplandırabilirsiniz. Örneğin, bir işlem birden fazla parça ekleyebilir veya değiştirebilir. Bu gruplandırma, aynı ekranda (ör. bölünmüş görünümler) görüntülenen birden fazla eşdüzey parçanız olduğunda yararlı olabilir.
Her bir işlemi FragmentManager
tarafından yönetilen bir arka yığına kaydedebilirsiniz. Böylece kullanıcının, etkinliklerde geriye gitmeye benzer şekilde parça değişikliklerinde geriye gitmesine olanak tanıyabilirsiniz.
Aşağıdaki örnekte gösterildiği gibi, beginTransaction()
yöntemini çağırarak FragmentManager
öğesinden FragmentTransaction
örneği alabilirsiniz:
Kotlin
val fragmentManager = ... val fragmentTransaction = fragmentManager.beginTransaction()
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Her FragmentTransaction
üzerindeki son çağrı işlemi gerçekleştirmelidir.
commit()
çağrısı, FragmentManager
için tüm işlemlerin işleme eklendiğini 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 düzenlenmesine izin ver
Her FragmentTransaction
, setReorderingAllowed(true)
özelliğini 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.
Bununla birlikte, FragmentManager
özellikle de arka yığında çalışıp animasyonlar ile geçişler çalıştırdığında FragmentTransaction
öğenizi düzgün bir şekilde yürütmesine izin vermeniz gerekir. İşaretin etkinleştirilmesi, birden fazla işlem birlikte yürütülürse ara parçaların (ör. eklenen ve daha sonra hemen değiştirilenler) yaşam döngüsü değişikliklerinden geçmemesini veya animasyonlarının ya da geçişlerinin yürütülmemesini 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.
Parça ekleme ve kaldırma
FragmentManager
öğesine bir parça eklemek için işlemde add()
çağrısı yapın. Bu yöntem, parça için kapsayıcı'nın kimliğinin yanı sıra eklemek istediğiniz parçanın sınıf adını da alır. Eklenen parça RESUMED
durumuna taşınır. Kapsayıcının, görünüm hiyerarşisinin parçası olan bir FragmentContainerView
olması önemle tavsiye edilir.
Bir parçayı ana makineden kaldırmak için remove()
çağrısı yaparak parça yöneticisinden findFragmentById()
veya findFragmentByTag()
aracılığıyla alınan parça örneğini iletin.
Parçanın görünümü daha önce bir kapsayıcıya eklenmişse bu noktada görünüm kapsayıcıdan kaldırılır. Kaldırılan parça, DESTROYED
durumuna taşınır.
Bir kapsayıcıdaki mevcut parçayı, sağladığınız yeni bir parça sınıfının örneğiyle değiştirmek için replace()
aracını kullanın. replace()
çağrısı, kapsayıcıdaki bir parçayla remove()
çağırmaya ve aynı kapsayıcıya yeni bir parça eklemeye eşdeğerdir.
Aşağıdaki kod snippet'i, bir parçayı başka bir parçayla nasıl değiştirebileceğinizi gösterir:
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, yeni bir ExampleFragment
örneği, varsa şu anda R.id.fragment_container
tarafından tanımlanan düzen kapsayıcısında bulunan parçanın yerini alır.
Varsayılan olarak, FragmentTransaction
öğesinde yapılan değişiklikler arka yığına eklenmez. Bu değişiklikleri kaydetmek için FragmentTransaction
numaralı telefondan addToBackStack()
numaralı telefonu arayabilirsiniz. Daha fazla bilgi için Parça yöneticisi bölümüne bakın.
Kaydetme eşzamansız
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 parça işlemini kullanıcı arayüzü iş parçacığınızda hemen çalıştırmak için commitNow()
yöntemini çağırabilirsiniz.
commitNow
uygulamasının addToBackStack
ile uyumlu olmadığını unutmayın. Alternatif olarak henüz executePendingTransactions()
yöntemini çağırarak commit()
çağrıları tarafından gönderilen ve henüz çalıştırılmamış tüm bekleyen FragmentTransactions
öğelerini yürütebilirsiniz. Bu yaklaşım addToBackStack
ile uyumludur.
Kullanım alanlarının büyük çoğunluğunda yalnızca commit()
yeterlidir.
İşlem sırası önemli
FragmentTransaction
içinde işlemleri gerçekleştirme sırası özellikle setCustomAnimations()
kullanıldığında önemlidir. Bu yöntem, belirtilen 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()
Parçanın yaşam döngüsünü sınırlandırma
FragmentTransactions
, işlem kapsamına eklenen bağımsız parçaların yaşam döngüsü durumunu etkileyebilir. setMaxLifecycle()
, FragmentTransaction
oluştururken verilen parça için maksimum durum belirler. Örneğin ViewPager2
, ekran dışı parçaları STARTED
durumuyla sınırlamak için setMaxLifecycle()
kullanır.
Parçanın görünümlerini gösterme ve gizleme
Kapsayıcıya eklenen parçaların görünümünü göstermek ve gizlemek için FragmentTransaction
yöntemlerini show()
ve hide()
kullanın.
Bu yöntemler, parçanın yaşam döngüsünü etkilemeden parçanın görüntülemelerinin görünürlüğünü ayarlar.
Bir parça içindeki görünümlerin görünürlüğünü açmak/kapatmak için parça işlemi kullanmanıza gerek olmasa da bu yöntemler, görünürlük durumundaki değişikliklerin arka yığındaki işlemlerle ilişkilendirilmesini istediğiniz durumlarda yararlıdır.
Parçaları ekleme ve çıkarma
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 yerleştirildiği zamanki durumda (STOPPED
) kalır.
Bu, parçanın kullanıcı arayüzünden kaldırıldığı ancak hâlâ parça yöneticisi tarafından yönetildiği anlamına gelir.
attach()
yöntemi, daha önce çıkarıldığı bir parçayı yeniden ekler.
Bu, 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 ele alındığından, aynı işlemde aynı parça örneğinde hem detach
hem de attach
çağrılarının birbirini etkili bir şekilde iptal etmesi, böylece parçanın kullanıcı arayüzünün yok edilmesini ve hemen yeniden oluşturulmasını önler. Bir parçayı söküp hemen yeniden eklemek istiyorsanız commit()
kullanıyorsanız executePendingOperations()
ile ayrılmış ayrı işlemler kullanın.