Parça işlemleri

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