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ızdaaddCallback
ü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.