Parça işlemleri

Çalışma zamanında, FragmentManager parçalar ekleyebilir, kaldırabilir, değiştirebilir ve parçalarla başka işlemler gerçekleştirebilir kullanıcı etkileşimine yanıt olarak. Önerdiğiniz her bir parça kaydetme işlemine işlem adı verilir ve kayıtta ne yapılacağını tarafından sağlanan API'leri kullanarak işlemi FragmentTransaction sınıfını kullanır. Birden fazla işlemi tek bir işlem altında gruplandırabilirsiniz. Örneğin, işlem birden fazla parça ekleyebilir veya değiştirebilir. Bu gruplandırma, ekranda birden çok kardeş parça görüntülendiğinde bölünmüş görünüm gibi farklı biçimler kullanabilirsiniz.

Her bir işlemi FragmentManager kullanarak kullanıcının parça değişiklikleri - etkinliklerde geriye doğru gitmeye benzer.

FragmentManager üzerinden FragmentTransaction örneği alabilirsiniz aşağıdaki örnekte gösterildiği gibi beginTransaction() yöntemini çağırarak:

Kotlin

val fragmentManager = ...
val fragmentTransaction = fragmentManager.beginTransaction()

Java

FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

Her FragmentTransaction üzerindeki son çağrının işlemi gerçekleştirmesi gerekir. commit() çağrısı, FragmentManager uygulamasına tüm işlemlerin işleme eklendi.

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 ver

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. Bununla birlikte, FragmentManager eklentisinin düzgün bir şekilde yürütülmesine izin vermek için gereklidir özellikle arka yığında çalışırken FragmentTransaction animasyonlar ve geçişler çalıştırır. Bayrağı etkinleştirmek, birden fazla işlem birlikte yürütülürse, (örneğin, eklenip hemen değiştirilenler) veya animasyon ya da geçişlerinin yürütülmesini sağlayabilir. Lütfen Bu işaret hem işlemin ilk yürütülmesini hem de gerisini etkiler popBackStack() ile işlem.

Parça ekleme ve kaldırma

FragmentManager öğesine parça eklemek için şunu çağırın: add() gösteren bir e-posta alırsınız. Bu yöntem parçaya ait kapsayıcının kimliği ve parçayı seçeceğim. Eklenen parça, RESUMED öğesine taşınır durumu. Kapsayıcının FragmentContainerView birini seçin.

Bir parçayı ana makineden kaldırmak için şu komutu çağırın: remove() parçadan alınan bir parça örneğinden geçme findFragmentById() veya findFragmentByTag() aracılığıyla yöneticisisiniz. Parçanın görünümü bir kapsayıcıya önceden eklenmişse görünüm artık bu kapsayıcıdan kaldırılmış olabilir. Kaldırılan parça taşınır DESTROYED durumuna.

Tekliflerinizi otomatikleştirmek ve optimize etmek için replace() öğesini, bir container'daki mevcut bir parçayı parça sınıfını kullanabilirsiniz. replace() işlevinin çağrılması şuna eşdeğerdir: kapsayıcıdaki bir parçayla remove() çağrısı yapma ve yeni bir parça ekleme parçasını oluşturur.

Aşağıdaki kod snippet'i, bir parçayı diğeriyle 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 parçanın yerini alır şu anda R.id.fragment_container.

Varsayılan olarak, FragmentTransaction içinde yapılan değişiklikler hazırlar. Bu değişiklikleri kaydetmek için addToBackStack() FragmentTransaction üzerinde. Daha fazla bilgi için bkz. Parça yöneticisi.

Kaydetme eşzamansız

Telefon etme commit() İşlemi hemen gerçekleştirmez. Daha ziyade, ana kullanıcı arayüzü iş parçacığında çalışacak şekilde planlandı. Eğer gerekli ancak yine de commitNow() öğesini eklemeniz gerekir.

commitNow uygulamasının addToBackStack ile uyumlu olmadığını unutmayın. Alternatif olarak: tarafından gönderilen ve beklemede olan tüm FragmentTransactions commit() executePendingTransactions() çağrısı yapılarak henüz başlatılmamış olan çağrılar. 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().

Operasyon sıralaması önemlidir

Belirli bir FragmentTransaction özellikle setCustomAnimations() kullanılırken çok önemlidir. Bu yöntemi, belirtilen animasyonları takip eder.

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ırlama

FragmentTransactions, kullanıcının yaşam döngüsü durumunu etkileyebilir parçalarının sayısını kontrol edin. Bir FragmentTransaction, setMaxLifecycle() belirtilen parça için maksimum durumu belirler. Örneğin, ViewPager2 kullanımları Ekran dışı parçaları STARTED durumuyla sınırlamak için setMaxLifecycle().

Parçanın görünümlerini gösterme ve gizleme

FragmentTransaction yöntemlerini kullanın show() ve hide() görebilirsiniz. Bu yöntemler, parçanın görünümlerinin görünürlüğünü etkilemeden ayarlar parçanın yaşam döngüsünü takip eder.

Görünürlüğü açıp kapatmak için parça işlemi kullanmanız gerekmez. parçanın içindeki görünümlerin dışına çıkarsa bu yöntemler, görünürlük durumundaki değişikliklerin ilişkilendirilmesini istiyorsanız işlemleri olabilir.

Parça ekleme ve çıkarma

FragmentTransaction yöntemi detach() parçayı kullanıcı arayüzünden ayırır ve görünüm hiyerarşisini yok eder. Parça arka gruba yerleştirildiğinde olduğu gibi aynı durumda (STOPPED) kalır. Bu, parçanın kullanıcı arayüzünden kaldırıldığı ancak hâlâ parça yöneticisidir.

İlgili içeriği oluşturmak için kullanılan attach() yöntemi, daha önce ayrıldığı bir parçayı tekrar ekler. Bu, görünüm hiyerarşisinin yeniden oluşturulmasına, kullanıcı arayüzüne eklenmesine ve gösterilir.

FragmentTransaction, tek bir atomik işlem kümesi olarak ele alınır. hem detach hem de attach çağrılarına aynı parça örneğinde birbirlerini etkili bir şekilde iptal edebilir ve böylece parçanın kullanıcı arayüzünün kaldırılması ve hemen yeniden oluşturulması. Ayrı commit() kullanılıyorsa executePendingOperations() ile ayrılmış işlemler, bir parçayı ayırıp hemen yeniden eklemek istiyorsanız.