Özel geri gezinme çubuğu sağlama

Geri gezinme, kullanıcıların geçmişte kaldıkları ekranlarında ziyaret edin. Tüm Android cihazlar bu tür için bir Geri düğmesi sağlar bu nedenle uygulamanızın kullanıcı arayüzüne bir Geri düğmesi eklememeniz gerekir. Şuna bağlı olarak: Bu düğme fiziksel bir düğme veya yazılım olabilir. düğmesini tıklayın.

Android, kullanıcı gezinirken geriye dönük bir hedef yığını sağlar. pek çok yolu vardır. Bu genellikle Android'in önceki hedefler için geri düğmesine basın. Ancak her zaman uygulamanızın geri davranışını izlemesi için bazı durumlarda mümkün olan en iyi kullanıcı deneyimini Örneğin, WebView kullanırken kullanıcının belirli işlemleri gerçekleştirmesini sağlamak için, varsayılan Geri düğmesi davranışını Önceki ekranlar yerine web tarama geçmişlerinde geri gitme dokunun.

Özel geri gezinme uygulayın

ComponentActivity, temel FragmentActivity için sınıf ve AppCompatActivity, öğesini kullanarak Geri düğmesinin davranışını kontrol etmenizi sağlar. OnBackPressedDispatcher, getOnBackPressedDispatcher() numaralı telefonu arayarak alabilirsiniz.

OnBackPressedDispatcher, Geri düğmesi etkinliklerinin nasıl gönderileceğini kontrol eder bir veya daha fazla OnBackPressedCallback kullanıcısına nesneler'i tıklayın. OnBackPressedCallback işlevinin kurucusu ilk etkin durumuna ayarlanır. Yalnızca geri arama etkinleştirildiğinde (ör. isEnabled() true dönerse) görev dağıtıcı, geri çağırmanın handleOnBackPressed() geri düğmesi etkinliğini işlemek için gereklidir. Şu numarayı arayarak durumu değiştirebilirsiniz: setEnabled().

Geri çağırma işlevleri, addCallback yöntemleriyle eklenir. Bu nedenle, addCallback() bağlantısını kullanın. LifecycleOwner alan Bu, OnBackPressedCallback öğesinin yalnızca LifecycleOwner Lifecycle.State.STARTED. Etkinlik, ilişkilendirildikleri zaman kaydedilen geri çağırmaları da kaldırır. LifecycleOwner, bellek sızıntılarını önleyerek uygun hale geldi parçalarda veya daha kısa ömürlü olan diğer yaşam döngüsü sahiplerinde kullanım için daha iyi bir fırsattır.

Aşağıda, bir geri çağırma uygulaması örneği verilmiştir:

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() üzerinden birden fazla geri arama sağlayabilirsiniz. Bu sırada, geri çağırma işlevleri ters sırada çağrılır: eklenir. Son eklenen geri çağırma, Geri düğmesi etkinliği. Örneğin, one, two ve three öğeleri sırasıyla şu sırayla çağrılır: Sırasıyla three, two ve one.

Geri çağırma işlevleri Sorumluluk Zinciri desen. Zincirdeki her bir geri çağırma, yalnızca önceki geri çağırma etkinleştirilmedi. Bu, önceki örnekte, two geri çağırması yalnızca three geri çağırması durumunda çağrılır etkinleştirilemedi. one geri çağırması, yalnızca two geri çağırması durumunda çağrılır etkinleştirilmemiş olabilir.

addCallback() üzerinden eklendiğinde, geri arama, sorumluluk zincirine dahil edilmez. LifecycleOwner giriş yaptı Lifecycle.State.STARTED durumu.

OnBackPressedCallback içindeki etkin durumun değiştirilmesi çok önemlidir yukarıda açıklanan sıralamayı koruduğundan geçici değişiklikler için önerilir. Bu, özellikle birden fazla farklı iç içe yerleştirilmiş yaşam döngüsü sahipleri.

Ancak, OnBackPressedCallback öğesini tamamen kaldırmak istediğiniz durumlarda, telefon etmeli remove() Ancak bu genellikle gerekli değildir çünkü ilişkili LifecycleOwner kaldırıldı.

onBackPrinted() etkinliği

Şunu kullanıyorsanız: onBackPressed() geri düğmesi etkinliklerini işlemek için bir Bunun yerine OnBackPressedCallback. Ancak bu değişikliği yapamazsanız aşağıdaki kurallar geçerli olur:

  • addCallback aracılığıyla kaydedilen tüm geri aramalar, telefon ettiğinizde değerlendirilir super.onBackPressed().
  • Android 12 (API düzeyi 32) ve önceki sürümlerde onBackPressed her zaman çağrılır. kayıtlı OnBackPressedCallback örneklerinden bağımsız olarak kullanılabilir.