Ö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 eklememeniz gerekir. 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, genellikle Geri düğmesine basıldığında Android'in önceki hedeflere düzgün bir şekilde gitmesini sağlar. 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 gitmesini sağlayabilirsiniz.

Özel geri gezinme uygulama

FragmentActivity ve AppCompatActivity için temel sınıf olan ComponentActivity, getOnBackPressedDispatcher() numaralı telefonu arayarak alabileceğiniz OnBackPressedDispatcher özelliğini kullanarak 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. Yalnızca geri çağırma etkinleştirildiğinde (ör. isEnabled(), true değerini döndürür) görev dağıtıcısı, 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 aracılığıyla eklenir. LifecycleOwner alan addCallback() yönteminin kullanılması önemle tavsiye edilir. Bu, OnBackPressedCallback öğesinin yalnızca LifecycleOwner Lifecycle.State.STARTED olduğunda eklenmesini sağlar. Etkinlik, ilişkili LifecycleOwner yok edildiğinde de kayıtlı geri çağırmaları kaldırır. Bu da bellek sızıntılarını önler ve etkinliği, 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 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() aracılığıyla birden fazla geri arama sağlayabilirsiniz. Bu durumda, geri çağırmalar eklendikleri sırayla ç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, sırayla one, two ve three adlı üç geri çağırma eklerseniz bunlar sırasıyla three, two ve one sırasına göre çağrılır.

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. Bu, yukarıdaki örnekte two geri çağırmasının yalnızca three geri çağırma etkinleştirilmesi durumunda çağrılacağı anlamına gelir. one geri çağırması yalnızca two geri çağırma etkinleştirilmediğinde çağrılır ve bu şekilde devam eder.

addCallback() aracılığıyla eklendiğinde geri çağırma, LifecycleOwner Lifecycle.State.STARTED durumuna girene kadar sorumluluk zincirine eklenmez.

OnBackPressedCallback öğesinde etkin durumun değiştirilmesi, yukarıda açıklanan sıralamayı koruduğu için geçici değişiklikler için kesinlikle önerilir. Bu, özellikle birden fazla farklı iç içe yerleştirilmiş yaşam döngüsü sahibine kayıtlı geri çağırmalarınız varsa önemlidir.

Ancak, OnBackPressedCallback öğesini tamamen kaldırmak isterseniz remove() yöntemini kullanmanız gerekir. Ancak ilişkili LifecycleOwner kaldırıldığında geri çağırmalar otomatik olarak kaldırıldığından bu işlem 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.