Parça işlemleri

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