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 çok iyi çalıştığı için uygulamayı yalnızca dikey yönle kısıtladınız. Ancak yatay yönde büyük ekranlarda daha fazlasını yapma fırsatı olduğunu görüyorsunuz.

Uygulamayı küçük ekranlarda dikey yönle kısıtlarken büyük ekranlarda yatay yönü etkinleştirmek için ne yapabilirsiniz?

En iyi uygulamalar

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

Uyarlanabilir uygulama kalitesi yönergeleri, 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ı desteklemesini önerir. Uygulamalar, düzenleri ve kullanıcı arayüzlerini farklı yapılandırmalar için optimize etmeli ve yapılandırma değişiklikleri sırasında durumu kaydedip geri yüklemelidir.

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

Malzemeler

  • screenOrientation: Uygulamanızın cihaz yönü 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 gösteren ve ekran boyutlarını DP cinsinden okumanıza olanak tanıyan birleştirilebilir yerel sağlayıcı.
  • LaunchedEffect: Bir anahtar değiştiğinde (bu örnekte yapılandırma değiştiğinde) bir kod bloğu çalıştıran Compose yan etki API'si.

Adımlar

Uygulamanın, uygulama manifestinde varsayılan olarak yön değişikliklerini işlemesini sağlayın. Ardından, çalışma zamanında Jetpack Compose'u kullanarak yönü dinamik olarak kompakt ekranlarda (telefonlar) dikey olarak 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ör tabanlı döndürmeyi kilitlemediyse uygulamanız tüm cihaz yönlerini destekler.

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

unspecified ve fullUser kullanımı arasındaki fark küçük ama önemlidir. screenOrientation değeri belirtmezseniz yönü sistem seçer ve sistemin yönü tanımlamak için kullandığı politika cihazdan cihaza farklılık gösterebilir. Öte yandan, fullUser değerini 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 kilitlediyse uygulama, kullanıcının tercihini izler. Aksi takdirde sistem, olası dört ekran yönünden (dikey, yatay, ters dikey veya ters yatay) herhangi birine izin verir. android:screenOrientation sayfasına bakın.

2. Compose'da yönü dinamik olarak kısıtlama

Jetpack Compose'da, geçerli ekran boyutlarını DP cinsinden reaktif olarak LocalConfiguration.current üzerinden okuyabilir ve yapılandırma her değiştiğinde etkinliğin yönünü güncellemek için LaunchedEffect kullanabilirsiniz.

Ekran genişliği veya yüksekliği 600dp değerinden küçükse (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.

Aşağıda, derlenebilir uygulamanın tamamını görebilirsiniz:

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ı her 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 etkinliğin yeniden oluşturulmasına 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ın döndürülmesinden bağımsız olarak küçük ekranlarda dikey yönde kalmalıdır. Uygulama, büyük ekranlarda yatay ve dikey yönleri desteklemelidir.

Ek kaynaklar

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