Kullanıcılar, geri gezinme özelliğini kullanarak ekranlar arasında geriye doğru gezinir. Çoğu Android cihazda geri düğmesi (fiziksel, yazılımsal veya harekete dayalı) bulunur. Genellikle uygulamanıza geri düğmesi eklememeniz gerekir. Ancak uyumluluk modundaki Android Automotive OS (AAOS) cihazlarda sistem geri düğmesi kullanılır. Bu, gezinmeyi yönetir. Bu nedenle kendi gezinme kodunuzu 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ı tutar. Bu genellikle Android'in, geri düğmesine basıldığında önceki hedeflere doğru şekilde gitmesini sağlar. Ancak uygulamanızın mümkün olan en iyi kullanıcı deneyimini sunmak için kendi Geri davranışını uygulaması gereken birkaç durum olabilir. Örneğin, WebView kullanırken kullanıcının uygulamanızdaki önceki ekranlar yerine web tarama geçmişinde geriye gitmesine izin vermek için varsayılan geri düğmesi davranışını geçersiz kılmak isteyebilirsiniz.
Compose'da özel geri gezinme uygulama
Jetpack Compose'da, BackHandler composable'ını kullanarak özel geri gezinmeyi işleyebilirsiniz.
Navigation Compose kullanırken eski yığındaki önceki ekrana gitmek için genellikle NavController.navigateUp() veya NavController.popBackStack() kullanılır. Ancak BackHandler, kullanıcının sistem geri düğmesine bastığı veya geri hareketini kullandığı durumlarda özel davranış uygulamak istediğinizde kullanışlıdır. Örneğin, uygulamanızda WebView gösteriyorsanız kullanıcıların sistemin geri düğmesine bastıklarında göz atma geçmişinde geri gitmelerine izin vermek isteyebilirsiniz.
Temel kullanım
Aşağıdaki örnekte, özel durumu kontrol etmek için geri etkinliğinin nasıl yakalanacağı gösterilmektedir (ör. bir paneli daraltma):
@Composable fun MyScreen() { var isExpanded by remember { mutableStateOf(false) } // Intercept the back button or gesture only when isExpanded is true BackHandler(enabled = isExpanded) { // Collapsing the content disables this handler, so it does not // receive the next back event. isExpanded = false } if (isExpanded) { Text("Expanded content. Go back to collapse it.") } else { Button(onClick = { isExpanded = true }) { Text("Expand") } } }
Birleştirilebilir ağaç kesişimi
Composable ağacınızın farklı seviyelerinde birden fazla etkinleştirilmiş BackHandler composable'ınız varsa geri etkinliğini yalnızca en içteki composable yakalar.
Görünümler ile özel geri gezinme özelliğini uygulama
ComponentActivity, FragmentActivity ve AppCompatActivity için temel sınıftır. getOnBackPressedDispatcher() yöntemini çağırarak alabileceğiniz OnBackPressedDispatcher yöntemini kullanarak Geri düğmesinin davranışını kontrol etmenizi sağlar.
OnBackPressedDispatcher, Geri düğmesi etkinliklerinin bir veya daha fazla OnBackPressedCallback nesnesine nasıl gönderileceğini kontrol eder. OnBackPressedCallback için oluşturucu, başlangıçta etkinleştirilmiş durum için bir boole değeri alır. Yalnızca bir geri çağırma etkinleştirildiğinde (örneğin, isEnabled(), true değerini döndürdüğünde) dağıtıcı, geri düğmesi etkinliğini işlemek için geri çağırmanın handleOnBackPressed() yöntemini çağırır. setEnabled() işlevini çağırarak etkinleştirme durumunu değiştirebilirsiniz.
Geri çağırmalar, addCallback yöntemleri kullanılarak eklenir. LifecycleOwner süren addCallback() yöntemini kullanın. Bu şekilde, OnBackPressedCallback yalnızca LifecycleOwner Lifecycle.State.STARTED olduğunda eklenir. Bu etkinlik, ilişkili LifecycleOwner yok edildiğinde kayıtlı geri çağırmaları da kaldırır. Bu sayede bellek sızıntıları önlenir ve etkinlik, parçalarda veya etkinlikten daha kısa bir kullanım ömrüne sahip diğer yaşam döngüsü sahiplerinde kullanıma uygun hale gelir.
Aşağıda örnek bir geri çağırma uygulaması verilmiştir:
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 } ... }
addCallback() kullanarak birden fazla geri çağırma sağlayabilirsiniz.
Bu durumda geri çağırmalar, eklendikleri sıranın tersine çağrılır. Yani en son eklenen geri çağırmaya, Geri düğmesi etkinliğini işleme fırsatı ilk olarak 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ıyla çağrılır.
Geri çağırmalar, Chain of Responsibility (Sorumluluk Zinciri) modelini izler. Zincirdeki her geri çağırma, yalnızca önceki geri çağırma etkinleştirilmediyse çağrılır. Bu nedenle, önceki örnekte geri çağırma two yalnızca geri çağırma three etkinleştirilmemişse çağrılır. one geri çağırması yalnızca two geri çağırması etkinleştirilmediyse çağrılır ve bu kalıp diğer geri çağırmalar için de geçerlidir.
addCallback() kullanılarak eklendiğinde geri çağırmanın, LifecycleOwner Lifecycle.State.STARTED durumuna girene kadar sorumluluk zincirine eklenmediğini unutmayın.
Geçici değişiklikler için geri çağırmada etkin durumun değiştirilmesi önemle tavsiye edilir. Bu sayede, daha önce açıklanan sıralama korunur. Bu, özellikle birden fazla farklı iç içe yerleştirilmiş yaşam döngüsü sahibinde kayıtlı geri çağırmalarınız varsa önemlidir.
Geri aramayı tamamen kaldırmak istiyorsanız remove() yöntemini çağırın.
Geri çağırmalar, ilişkili LifecycleOwner yok edildiğinde otomatik olarak kaldırıldığı için bu genellikle gerekli değildir.