Jetpack WindowManager, değişebilir ekran yapılandırmasına sahip cihazlarda pencereleri yönetmek için Google tarafından sağlanan bir Android kütüphanesidir. Katlanabilir cihazlar, büyük ekranlar ve çoklu pencere moduyla çalışmak için API sağlar. Android Developers, 2025'e göre, kütüphane tabletler için optimize edilmiş Google Play ilk 100 uygulamasının %78'inde kullanılmaktadır. WindowManager; FoldingFeature, WindowMetrics ve ScreenContinuityController sınıflarını içerir ve tüm uyarlanabilir düzen senaryolarını kapsar.
Önemli Noktalar
Jetpack WindowManager, AndroidX paketindeki bir kütüphanedir ve Android cihazlarda pencereler ve ekran yapılandırmalarıyla çalışmayı soyutlar. Kompakt telefonlardan katlanabilir cihazlara ve masaüstü modlu tabletlere kadar ekran parçalanması sorununu çözer.
WindowManager'dan önce geliştiriciler, katlanabilir cihazları ve çoklu pencere modlarını dikkate almayan eski Display API ve Resources#getConfiguration'u kullanıyordu. WindowManager, tüm senaryolar için birleşik bir API sağlar: tek bir kütüphane FoldingFeature, WindowMetrics, WindowSizeClass ve ScreenContinuity'yi kapsar. Bu, standart kod miktarını azaltır ve arayüzü farklı cihazlara uyarlarken oluşan hataları ortadan kaldırır.
Google I/O 2024'e göre, Jetpack WindowManager kararlı sürüm 1.3, menteşe sensörleri desteği, açılma açısını belirlemek için API ve Jetpack Compose ile gelişmiş entegrasyon içerir. Kütüphane, Support Library aracılığıyla Android 10 (API 29) ile geriye dönük uyumludur ve cihaz yeteneklerine otomatik olarak uyum sağlar.
FoldingFeature, katlanabilir cihazlarla çalışmak için Jetpack WindowManager'ın merkezi sınıfıdır. Katlamanın fiziksel konumu hakkındaki tüm bilgileri (durum: HALF_OPENED, FLAT, TABLE_TOP, yön: VERTICAL, HORIZONTAL, menteşe koordinatları ve derece cinsinden açılma açısı) kapsüller.
Kütüphane dört katlama durumu tanımlar. STATE_FLAT — cihaz tamamen açık, ekran düz. STATE_HALF_OPENED — cihaz kısmen katlanmış, ekran 30 ila 160 derece açıda. STATE_TABLE_TOP — cihaz bir yüzey üzerinde dizüstü bilgisayar duruşunda. STATE_FULLY_OPENED — sürüm 1.2'de FLAT ile değiştirilen kullanımdan kaldırılmış bir durum.
Katlamalar dikey (VERTICAL_FOLD) veya yatay (HORIZONTAL_FOLD) olabilir. Bounds, uygulama penceresi koordinatlarında katlama alanını tanımlayan bir dikdörtgendir. Geliştirici, UI öğelerini katlamanın üstüne ve altına yerleştirmek için bu verileri kullanır ve kritik alanla içerik çakışmasını önler.
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()
flow.collect { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
}
}
WindowMetrics, WindowManager 1.0'dan itibaren kullanılabilen, uygulama penceresinin kesin boyutlarını almak için bir API'dir. Display#getSize'in aksine, WindowMetrics çoklu pencere modunu, DeX'i ve serbest biçimli pencereyi dikkate alır. Metrikler currentWindowMetrics (geçerli boyut) ve maximumWindowMetrics (cihazda mümkün olan maksimum boyut) döndürür.
WindowSizeClass, WindowManager 1.1'de ortaya çıkan bir sınıflandırıcıdır. Ekranları üç kategoriye ayırır: Compact (genişlik 600dp'den az — telefon), Medium (600–840dp — dikey yönde tablet) ve Expanded (840dp'den fazla — yatay yönde tablet). Bu sınıf, düzinelerce boyut kontrolünü tek bir sınıflandırmayla değiştirerek uyarlanabilir düzeni basitleştirir.
| WindowSizeClass | Ekran Genişliği | Örnek Cihaz | Önerilen Düzen |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Tek bölme, alt navigasyon |
| Medium | 600–839dp | Pixel Fold (katlanmış), iPad Mini | Liste-ayrıntı, yan navigasyon |
| Expanded | 840dp+ | Galaxy Z Fold (açık), iPad Pro | Çoklu bölme, navigasyon rayı |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController, katlanabilir cihaz yapılandırması değiştiğinde Activity durumunu korumaktan sorumlu bir WindowManager bileşenidir. Kullanıcı telefonu açtığında veya kapattığında, denetleyici uygulamayı yeni duruş hakkında bilgilendirir ve sorunsuz geçiş için mekanizmalar sağlar.
Denetleyici, bir FoldingFeature nesnesi içeren geri çağrıyı kabul eden registerContinuityListener aracılığıyla dinleyicileri kaydeder. Her duruş değişikliğinde, geri çağrı Activity yeniden oluşturulmadan önce tetiklenir ve geliştiriciye durumu manuel olarak kaydetme fırsatı verir. Uygulama ViewModel kullanıyorsa, ek işlem gerekmez — veriler otomatik olarak kaydedilir.
Compose uygulamaları, LocalWindowSizeClass ve CompositionLocalProvider aracılığıyla ScreenContinuity'den yararlanır. WindowMetrics değiştiğinde bileşenler otomatik olarak yeniden oluşur. rememberSaveable yeniden oluşumlar arasında durumu korur ve Modifier.windowInsets sistem ekran alanlarını dikkate alır.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Katlanabilir bir cihazın farklı duruşlarına arayüzü uyarlamak için Jetpack WindowManager kullanan bir Activity'nin tam örneğini inceleyelim. WindowManagerActivity, Flow API aracılığıyla FoldingFeature değişikliklerine abone olur ve tek bölmeli ve çift bölmeli düzenler arasında geçiş yapar.
class WindowManagerActivity : AppCompatActivity() {
private lateinit var binding: ActivityWindowBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityWindowBinding.inflate(layoutInflater)
setContentView(binding.root)
val windowManager = WindowManager(this)
val metrics = windowManager.currentWindowMetrics
if (metrics.bounds.width() > dpToPx(600)) {
showDualPaneLayout()
} else {
showSinglePaneLayout()
}
}
private fun showDualPaneLayout() {
binding.content.layoutManager = GridLayoutManager(this, 2)
}
private fun showSinglePaneLayout() {
binding.content.layoutManager = LinearLayoutManager(this)
}
}
Örnek, temel bir senaryoyu gösterir: uygulama WindowMetrics'i kontrol eder ve tek bölmeli veya çift bölmeli bir düzen seçer. Gerçek projelerde, daha esnek uyarlama için WindowSizeClass ve katlanabilir cihazları işlemek için FoldingFeature kullanılması önerilir. Kütüphane ayrıca kesintisiz geçişi destekler — düzenler arasında geçiş yaparken yumuşak animasyon.
Android Studio, Jetpack WindowManager'ı test etmek için yerleşik araçlar içerir. Emülatör, Folding Postures sekmesi aracılığıyla duruş değiştirme ile katlanabilir cihazları (Pixel Fold, Galaxy Z Fold) destekler. Layout Inspector, gerçek zamanlı olarak geçerli WindowMetrics ve FoldingFeature sınırlarını gösterir.
adb shell dumpsys window displays komutu, bağlı tüm ekranlar ve yapılandırmaları hakkında bilgi verir. Bir katlamayı simüle etmek için, ek duruş parametreleriyle adb shell am broadcast -a android.intent.action.SCREEN_ON kullanın. WindowManager, WindowManager#logState aracılığıyla tüm FoldingFeature değişikliklerini görüntüler.
Ana entegrasyon sorunları — çoklu pencere modunda WindowMetrics güncellemelerini görmezden gelme, dikey katlamada bounds'un yanlış işlenmesi ve tüm duruşlarda test eksikliği. Önerilir her duruşu ayrı ayrı test edin ve aralarında geçiş yaparken davranışı kontrol edin. Manuel boyut kontrolleri yerine WindowSizeClass kullanımı hataları %60 oranında azaltır.
Sıkça Sorulan Sorular
Jetpack WindowManager, Android 5.0 (API 21)'den itibaren Jetpack AndroidX aracılığıyla kullanılabilir. Ancak FoldingFeature ve ScreenContinuityController'ın çalışması için Android 10+ (API 29) ve fiziksel katlaması olan bir cihaz gerekir. WindowMetrics tüm sürümlerde çalışır, ancak veri doğruluğu üreticiye bağlıdır.
Display API eskidir ve katlanabilir cihazları, çoklu pencere ve DeX modlarını dikkate almaz. WindowManager tüm senaryolar için birleşik bir API sağlar: katlamalar için FoldingFeature, kesin boyutlar için WindowMetrics ve uyarlanabilir düzen için WindowSizeClass. Display#getSize, çoklu pencerede yanlış veriler döndürebilir.
WindowSizeClass, düzinelerce ekran genişliği kontrolünü üç kategoriyle değiştirir: Compact, Medium ve Expanded. Elle dp hesaplamak ve eşiklerle karşılaştırmak yerine, geliştirici belirli bir kategori için düzen seçer. Bu, kodu basitleştirir, hata olasılığını azaltır ve yeni cihaz desteğini hızlandırır.
Evet, WindowManager normal telefonlar için bile kullanışlıdır. WindowMetrics, çoklu pencere modunda ve DeX kullanırken doğru çalışır. WindowSizeClass, tabletler ve büyük ekranlar için arayüzü uyarlamaya yardımcı olur. Kütüphane APK'ya yalnızca 48 KB ekler ve performansı etkilemez.
Pixel Fold veya Galaxy Z Fold gibi AVD'ye sahip Android Emulator, FoldingFeature işlemlerini tamamen simüle eder. Extended Controls'de Folding Postures sekmesini seçin ve duruşları değiştirin. Ayrıca FoldingFeature sahte nesneleriyle birim testleri için WindowManager Test Kit kullanabilirsiniz.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun