Telefonlarda uygulama yönü kısıtlanıyor ancak büyük ekranlarda kısıtlanmıyor

İki yıldız puanı simgesi

Uygulamanız, telefonlarda dikey yönde mükemmel şekilde çalıştığı için uygulamayı yalnızca dikey yönle sınırladınız. Ancak büyük ekranlarda yatay yönde daha fazla şey yapma fırsatı görüyorsunuz.

Uygulamayı küçük ekranlarda dikey yönle kısıtlayıp büyük ekranlarda yatay yönü nasıl etkinleştirebilirsiniz?

En iyi uygulamalar

En iyi uygulamalar, cihaz yönü gibi kullanıcı tercihlerine saygı gösterir.

Uyarlanabilir uygulama kalitesi yönergelerinde, uygulamaların dikey ve yatay yönler, çoklu pencere modu ve katlanabilir cihazların katlanmış ve açılmış durumları dahil olmak üzere tüm cihaz yapılandırmalarını desteklemesi önerilir. Uygulamalar, farklı yapılandırmalar için düzenleri ve kullanıcı arayüzlerini optimize etmeli, yapılandırma değişiklikleri sırasında durumu kaydetmeli ve geri yüklemelidir.

Bu çözüm geçici bir önlemdir ve büyük ekran desteği sunar. Uygulamanızı tüm cihaz yapılandırmaları için tam destek sağlayacak şekilde iyileştirene kadar tarifi kullanın.

Malzemeler

  • screenOrientation: Uygulamanızın cihaz yönlendirme değişikliklerine nasıl yanıt vereceğini belirtmenize olanak tanıyan uygulama manifesti ayarı
  • Activity#setRequestedOrientation(): Çalışma zamanında uygulama yönünü değiştirebileceğiniz yöntem
  • LocalConfiguration: Mevcut cihazı Configuration kullanıma sunan, birleştirilebilir yerel sağlayıcı. Ekran boyutlarını DP cinsinden okumanıza olanak tanır.
  • LaunchedEffect: Bir anahtar değiştiğinde (bu örnekte yapılandırma değiştiğinde) bir kod bloğunu çalıştıran yan etki API'si oluşturun.

Adımlar

Uygulama manifestinde, uygulamanın yön değişikliklerini varsayılan olarak işlemesini sağlayın. Ardından, çalışma zamanında Jetpack Compose'u kullanarak yönü dinamik olarak küçük ekranlarda (telefonlar) dikey yönle kısıtlarken büyük ekranlarda tüm yönlere izin verin.

1. Uygulama manifestinde yön ayarını belirtme

Uygulama manifestinin screenOrientation öğesini bildirmekten kaçınabilir (bu durumda yön varsayılan olarak unspecified olur) veya ekran yönünü fullUser olarak ayarlayabilirsiniz. Kullanıcı, sensöre dayalı döndürmeyi kilitlemediyse uygulamanız tüm cihaz yönlerini destekler.

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

unspecified ve fullUser kullanmak arasındaki fark küçük olsa da önemlidir. screenOrientation değeri belirtmezseniz sistem yönü seçer ve yönü tanımlamak için sistemin kullandığı politika cihazdan cihaza farklılık gösterebilir. Öte yandan, fullUser belirtmek, kullanıcının cihaz için tanımladığı davranışla daha yakından eşleşir: Kullanıcı, sensör tabanlı döndürmeyi kilitlemişse uygulama, kullanıcı tercihine uyar. Aksi takdirde sistem, dört olası ekran yönünden herhangi birine (dikey, yatay, ters dikey veya ters yatay) izin verir. android:screenOrientation sayfasına göz atın.

2. Oluşturma bölümünde yönlendirmeyi dinamik olarak kısıtlama

Jetpack Compose'da, LocalConfiguration.current ile mevcut ekran boyutlarını DP'ler halinde reaktif olarak okuyabilir ve yapılandırma her değiştiğinde Etkinlik yönünü güncellemek için LaunchedEffect kullanabilirsiniz.

Ekran genişliği veya yüksekliği 600dp pikselden azsa (telefonlar için kompakt kesme noktasına karşılık gelir) yönü dikey olarak kısıtlayın. Aksi takdirde, sistemin uygulamayı kullanıcının tercihine göre (unspecified veya fullUser) döndürmesine izin verin.

Derlenebilir uygulamanın tamamını aşağıda bulabilirsiniz:

val configuration = LocalConfiguration.current
val context = LocalActivity.current

LaunchedEffect(configuration) {
    val activity = context ?: return@LaunchedEffect
    // Determine if screen is compact (phone-sized) in either width or height
    val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600
    activity.requestedOrientation = if (isCompact) {
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    } else {
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    }
}

Mantığı bir LaunchedEffect(configuration) bloğuna ekleyerek uygulama yapılandırması değiştiğinde (ör. etkinlik yeniden boyutlandırıldığında, ekranlar arasında taşındığında veya katlanabilir bir cihaz katlandığında ya da açıldığında) yön ayarını reaktif olarak geçersiz kılabilirsiniz.

Yapılandırma değişikliklerinin ne zaman gerçekleştiği ve ne zaman etkinlik yeniden oluşturmaya neden olduğu hakkında daha fazla bilgi için Yapılandırma değişikliklerini işleme başlıklı makaleyi inceleyin.

Sonuçlar

Uygulamanız artık cihaz döndürülse bile küçük ekranlarda dikey yönde kalmalıdır. Uygulama, büyük ekranlarda yatay ve dikey yönleri desteklemelidir.

Ek kaynaklar

Uygulamanızı her zaman tüm cihaz yapılandırmalarını destekleyecek şekilde yükseltmeyle ilgili yardım için aşağıdakilere bakın: