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