Özel geri gezinme çubuğu sağlama

Kullanıcılar geri gezinme özelliğini kullanarak ekranlarda geri gider. Çoğu Android cihazda fiziksel, yazılım tabanlı veya hareket tabanlı bir geri düğmesi bulunur. Genellikle uygulamanıza geri düğmesi eklememelisiniz. Ancak uyumluluk modundaki Android Automotive OS (AAOS) cihazlarda sistem geri düğmesi kullanılır. Bu, gezinmeyi yönetir. Bu nedenle, kendi gezinme menünüzü eklemeniz gerekmez. Ayrıntılı bilgi için AAOS Uyumluluk Modu başlıklı makaleyi inceleyin.

Android, kullanıcı uygulamanızda gezinirken hedeflerin geri yığınını korur. Bu genellikle Android'in, Geri düğmesine basıldığında önceki hedeflere düzgün şekilde gitmesine olanak tanır. Ancak, mümkün olan en iyi kullanıcı deneyimini sunmak için uygulamanızın kendi Geri davranışını uygulaması gerekebilecek birkaç durum vardır. Örneğin, WebView kullanırken kullanıcının uygulamanızdaki önceki ekranlar yerine web tarama geçmişinde geri gitmesine izin vermek için varsayılan Geri düğmesi davranışını geçersiz kılabilirsiniz.

Özel geri gezinme uygulama

FragmentActivity ve AppCompatActivity için temel sınıf olan ComponentActivity, OnBackPressedDispatcher özelliğini kullanarak Geri düğmesinin davranışını kontrol etmenize olanak tanır. OnBackPressedDispatcher özelliğini getOnBackPressedDispatcher() çağırarak alabilirsiniz.

OnBackPressedDispatcher, Geri düğmesi etkinliklerinin bir veya daha fazla OnBackPressedCallback nesnesine nasıl dağıtıldığını kontrol eder. OnBackPressedCallback sınıfının kurucusu, ilk etkin durum için bir boole alır. Yalnızca geri arama etkinleştirildiğinde (ör. isEnabled() true değerini döndürür) görev dağıtıcı, Geri düğmesi etkinliğini işlemek için geri çağırmanın handleOnBackPressed() yöntemini çağırır. setEnabled() çağrısını yaparak etkin durumu değiştirebilirsiniz.

Geri çağırma işlevleri addCallback yöntemleri aracılığıyla eklenir. LifecycleOwner alan adı alan addCallback() yöntemini kullanmanız önemle tavsiye edilir. Bu sayede OnBackPressedCallback yalnızca LifecycleOwner Lifecycle.State.STARTED olduğunda eklenir. Etkinlik, ilişkili LifecycleOwner yok edildiğinde kayıtlı geri çağırma işlevlerini de kaldırır. Bu, bellek sızıntılarını önler ve geri çağırma işlevlerinin, etkinlikten daha kısa ömürlü olan parçalarda veya diğer yaşam döngüsü sahiplerinde kullanılmasına olanak tanır.

Aşağıda geri çağırma işlevinin nasıl uygulanacağına dair bir örnek verilmiştir:

Kotlin

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

Java

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback will only be called when MyFragment is at least Started.
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

addCallback() üzerinden birden fazla geri arama sağlayabilirsiniz. Bu işlem yapılırken geri çağırma işlevleri, eklendikleri sıranın tersine göre çağrılır. Geri düğmesi etkinliğini işleme şansı ilk olarak en son eklenen geri çağırma işlevine verilir. Örneğin, sırasıyla one, two ve three adlı üç geri çağırma eklediyseniz bunlar sırasıyla three, two ve one sırasına göre çağrılır.

Geri çağırma işlevleri Sorumluluk Zinciri kalıbını izler. Zincirdeki her geri çağırma yalnızca önceki geri çağırma etkinleştirilmemişse çağrılır. Bu, önceki örnekte two geri çağırma işlevinin yalnızca three geri çağırma işlevi etkinleştirilmemişse çağrılacağı anlamına gelir. one geri çağırma işlevi yalnızca two geri çağırma işlevi etkinleştirilmemişse çağrılır.

addCallback() aracılığıyla eklendiğinde, LifecycleOwner Lifecycle.State.STARTED durumuna girene kadar geri çağırma işlevinin sorumluluk zincirine eklenmediğini unutmayın.

Yukarıda açıklanan sıralamayı koruduğu için geçici değişiklikler için OnBackPressedCallback'teki etkin durumun değiştirilmesi önemle tavsiye edilir. Bu, özellikle birden fazla farklı iç içe yerleştirilmiş yaşam döngüsü sahibine kayıtlı geri çağırma işlevleriniz varsa önemlidir.

Ancak OnBackPressedCallback öğesini tamamen kaldırmak istiyorsanız remove() numaralı telefonu aramanız gerekir. Ancak, ilişkili LifecycleOwner yok edildiğinde geri çağırma işlevleri otomatik olarak kaldırıldığı için bu genellikle gerekli değildir.

Etkinlik onBackPressed()

Geri düğmesi etkinliklerini yönetmek için onBackPressed() kullanıyorsanız bunun yerine OnBackPressedCallback kullanmanızı öneririz. Ancak bu değişikliği yapamıyorsanız aşağıdaki kurallar geçerli olur:

  • addCallback üzerinden kaydedilen tüm geri aramalar, super.onBackPressed()'u aradığınızda değerlendirilir.
  • Android 12 (API düzeyi 32) ve önceki sürümlerde, OnBackPressedCallback'un kayıtlı örneklerine bakılmaksızın onBackPressed her zaman çağrılır.