Özel geri gezinme çubuğu sağlama

Geri gezinme, kullanıcıların daha önce ziyaret ettikleri ekran geçmişinde geriye nasıl gittiğini sağlar. Tüm Android cihazlar bu tür gezinme için bir Geri düğmesi sağlar. Bu nedenle, uygulamanızın kullanıcı arayüzüne geri düğmesi eklemeyin. Kullanıcının Android cihazına bağlı olarak bu düğme fiziksel bir düğme veya yazılım düğmesi olabilir.

Android, kullanıcı uygulamanızda gezinirken arkada bir hedef yığını saklar. Bu şekilde Android, Geri düğmesine basıldığında önceki hedeflere düzgün bir şekilde gidebilir. Bununla birlikte, mümkün olan en iyi kullanıcı deneyimini sağlamak için uygulamanızın kendi Geri davranışını uygulaması gereken birkaç durum vardır.

Örneğin, bir WebView kullanırken varsayılan Geri düğmesi davranışını geçersiz kılarak kullanıcının uygulamanızdaki önceki ekranlar yerine web tarama geçmişine geri dönmesini sağlayabilirsiniz.

Android 13 ve sonraki sürümler Android cihazlar için tahmine dayalı geri hareketi içerir. Bu özellik hakkında daha fazla bilgi edinmek istiyorsanız Tahmine dayalı geri hareketi için destek ekleme başlıklı makaleye göz atın.

Özel geri gezinme uygulama

FragmentActivity ve AppCompatActivity için temel sınıf olan ComponentActivity, getOnBackPressedDispatcher() numaralı telefonu arayarak alabileceğiniz OnBackPressedDispatcher aracılığıyla Geri düğmesinin davranışını kontrol etmenize olanak tanır.

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

Geri çağırmalar addCallback yöntemleri kullanılarak eklenir. LifecycleOwner alan addCallback() yöntemini kullanmanızı öneririz. Bu, OnBackPressedCallback öğesinin yalnızca LifecycleOwner Lifecycle.State.STARTED olduğunda eklenmesini sağlar. Etkinlik, ilişkili LifecycleOwner yok edildiğinde kayıtlı geri çağırmaları da kaldırır. Bu da bellek sızıntılarını önler ve LifecycleOwner öğesini etkinlikten daha kısa bir süreye sahip parçalarda veya diğer yaşam döngüsü sahipleri için uygun hale getirir.

Örnek bir geri çağırma uygulamasını aşağıda görebilirsiniz:

Kotlin

class MyFragment : Fragment() {

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

        // This callback is only 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 is only 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() kullanarak birden çok geri arama sağlayabilirsiniz. Böylece, geri çağırmalar onları eklediğiniz sırada ters sırada çağrılır. En son eklenen geri çağırma, Geri düğmesi etkinliğini işlemek için ilk fırsatın verildiği yerdir. Örneğin, one, two ve three adlı üç geri çağırmayı bu sırayla eklerseniz bunlar şu sırayla çağrılır: three, two, one.

Geri çağırmalar Sorumluluk Zinciri kalıbına uyar. Zincirdeki her geri çağırma, yalnızca önceki geri çağırma etkinleştirilmemişse çağrılır. Yani, yukarıdaki örnekte two geri çağırması yalnızca three geri çağırması etkin değilse çağrılır ve one geri çağırması yalnızca two etkin değilse çağrılır.

Geri çağırma, addCallback() kullanılarak eklendiğinde LifecycleOwner, Lifecycle.State.STARTED durumuna girene kadar sorumluluk zincirine eklenmez.

Geçici değişiklikler için OnBackPressedCallback özelliğindeki etkin durumunu değiştirmenizi öneririz. Bu sayede, yukarıda açıklanan sıralama korunur. Bu, özellikle iç içe geçmiş birden çok yaşam döngüsü sahibine kayıtlı geri çağırmalarınız varsa önemlidir.

OnBackPressedCallback öğesini tamamen kaldırmak isterseniz remove() numarasını arayabilirsiniz. İlişkili LifecycleOwner kaldırıldığında geri çağırmalar otomatik olarak kaldırıldığından bu genellikle gerekli değildir.

onBackBasıned() etkinliği

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

  • super.onBackPressed() numaralı telefonu aradığınızda addCallback üzerinden kaydedilen tüm geri çağırma işlemleri değerlendirilir.
  • Android 12 (API düzeyi 32) ve önceki sürümlerde onBackPressed, kayıtlı OnBackPressedCallback örneklerinden bağımsız olarak her zaman çağrılır.