Pencere yönetimi

ChromeOS, Android uygulamalarını birden çok pencerede destekler. Sistem, uygulamaları, Şekil 1'de gösterildiği gibi, boyutu cihazın form faktörü tarafından belirlenen pencere kapsayıcılarına oluşturur.

Şekil 1. Farklı cihazlardaki bir uygulama penceresi.

Farklı ekran boyutlarında çalışan düzenler tasarlamak önemlidir. Farklı ekran boyutlarını desteklemek için Android yönergelerini izlerseniz uygulamanız Chrome OS'te çalışırken de iyi çalışır.

Bu sayfada, uygulamanızın penceresinin doğru şekilde başlatılmasını, sorunsuz bir şekilde yeniden boyutlandırılmasını ve boyutu değiştiğinde tüm içeriğini görüntülemesini nasıl sağlayacağınız gösterilmektedir.

İlk lansman boyutu

Uygulamalar aşağıdaki şekillerde ilk lansman boyutlarını isteyebilir:

  • Yalnızca masaüstü ortamlarında lansman boyutu kullanın. Bu, pencere yöneticisinin size uygun sınırları ve yönü belirlemesine yardımcı olur. Masaüstü modunda kullanıldığında bir tercih belirtmek için aşağıdaki meta etiketleri <activity> içine ekleyin:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • Statik başlatma sınırlarını kullanın. Aşağıdaki örnekte olduğu gibi, "sabit" bir başlangıç boyutu belirtmek için etkinliğinizin manifest girişinde <layout> kullanın:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • Dinamik başlatma sınırlarını kullanın. Bir etkinlik, yeni bir etkinlik oluştururken ActivityOptions.setLaunchBounds(Rect) oluşturabilir ve kullanabilir. Boş bir dikdörtgen belirterek uygulamanızın büyütülmesini sağlayabilirsiniz.

Pencereleri yeniden boyutlandırma

ChromeOS'te kullanıcılar bir uygulamanın penceresini normal şekilde yeniden boyutlandırabilirler: Şekil 2'de gösterildiği gibi, sağ alt köşeyi sürükleyerek.

2. Şekil. Yeniden boyutlandırılabilir bir uygulama penceresi.

View sınıfını kullanırken pencere yeniden boyutlandırma işlemini gerçekleştirmek için iki seçenek vardır:

  • onConfigurationChanged(..) yöntemini çağırarak yapılandırma değişikliklerine dinamik olarak yanıt verin. Örneğin, etkinliğin manifest dosyasına android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" ekleyebilirsiniz. Yapılandırma değişikliklerini işleme hakkında daha fazla bilgi için Yapılandırma değişikliklerini işleme bölümünü okuyun.
  • Sistemin etkinliği yeniden başlatmasına izin verin. Bu durumda, onSaveInstanceState değerini uygulayın ve önceki kayıtlı durumu geri yüklemek için ViewModel mimari bileşenini kullanın.

Jetpack Compose'u kullanırken yeniden boyutlandırma davranışı etkinliğinizin nasıl yapılandırıldığına bağlıdır. Değişiklikleri dinamik olarak işlerse pencere boyutu değiştiğinde bir yeniden oluşturma tetiklenir. Etkinlik sistem tarafından yeniden başlatılırsa yeniden başlatma sonrasında bir ilk bileşim gerçekleşir. Her iki durumda da, değişen pencere boyutlarına uyum sağlayan Oluşturma düzenleri oluşturmak önemlidir. Boyutların sabit olduğunu varsaymayın.

Pencere boyutları

Etkinliklerinizin her başladığında pencere boyutlarını okumasını ve içeriğini mevcut yapılandırmaya göre düzenlemesini sağlayın.

Mevcut yapılandırmayı belirlemek için geçerli etkinlikte getResources().getConfiguration() yöntemini çağırın. Arka plan etkinliğinin veya sistem kaynağının yapılandırmasını kullanmayın. Arka plan etkinliğinin bir boyutu yoktur ve sistem yapılandırmasında boyut ve yönler çakışan birden çok pencere bulunabilir. Bu nedenle kullanılabilir veriler çıkarılamaz.

Pencere ve ekran boyutunun aynı olmadığını unutmayın. DP'de pencere boyutunu öğrenmek için Activity.getResources().getConfiguration().screenWidth ve Activity.getResources().getConfiguration().screenHeight kullanın. Muhtemelen ekran boyutunu hiçbir zaman kullanmanız gerekmez.

İçerik sınırları

Pencerenin içerik sınırları, yeniden boyutlandırma sonrasında değişebilir. Örneğin, pencere ekrana sığmayacak kadar büyük olursa uygulama tarafından kullanılan pencere içinde yer alan alan değişebilir. Aşağıdaki yönergeleri izleyin:

  • Android'in düzen işlemini kullanan uygulamalar otomatik olarak kullanılabilir alana yerleştirilir.
  • Yerel uygulamaların, erişilebilir olmayan kullanıcı arayüzü öğelerine sahip olmaması için mevcut alanı okuması ve boyut değişikliklerini izlemesi gerekir. Bu yüzeyin ilk kullanılabilir boyutunu belirlemek için aşağıdaki yöntemleri çağırın:

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    Sürekli izleme bir gözlemci kullanılarak yapılabilir:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • view.addOnLayoutChangeListener(findViewById(android.R.id.content)) için dinleyici ekleyin

    Uygulama, posterini önceden ölçeklendiriyorsa bu işlemi çözünürlük her değiştiğinde yapın.

Serbest biçimli yeniden boyutlandırma

ChromeOS tüm pencerelerin serbestçe yeniden boyutlandırılabilmesini sağlar: kullanıcı bir pencerenin genişliğini, yüksekliğini ve ekrandaki konumunu değiştirebilir. Birçok Android uygulaması, serbest biçimde yeniden boyutlandırma düşünülmeden yazılır. Şu sorunları göz önünde bulundurun:

  • Ekranın konumu değişebilir. Pencereden ekrana ve ekrandan pencereye koordinat dönüşümlerini gerçekleştirmek için sistemi her zaman kullanın.
  • Android'in görünüm sistemini kullanıyorsanız pencere düzeniniz boyutu değiştiğinde otomatik olarak değişir.
  • Görüntüleme sistemini kullanmıyor ve yüzeyi devralıyorsanız uygulamanız boyut değişikliklerini kendi başına halletmelidir.
  • Yerel uygulamalar için mLastContent üyelerini veya ilk boyutu belirlemek için içerik görünümünü kullanın.
  • Uygulama çalışırken boyut değişikliklerine tepki vermek için onContentRectChangedNative veya onGlobalLayout etkinliklerini dinleyin.
  • Uygulamanın boyutu değiştiğinde, düzenleri ve çizimleri yeniden ölçeklendirin ya da yeniden yükleyin ve giriş alanlarını güncelleyin.

Tam ekran modu

Tam ekran modu, stok Android'de olduğu gibi çalışır. Pencere tüm ekranı kapatmıyorsa tam tarama istekleri (tüm sistem kullanıcı arayüzü öğeleri gizleniyor) yok sayılır. Uygulama büyütüldüğünde normal tam ekran yöntemleri, düzenleri ve işlevleri gerçekleştirilir. Bu işlem sistem kullanıcı arayüzü öğelerini (pencere kontrol çubuğu ve raf) gizler.

Ekran yönü

Android uygulamalarında en yaygın yön olan dikey yöndür çünkü çoğu telefon bu dikey modda tutulur. Dikey, telefonlar için iyi olsa da yatay modun tercih edildiği dizüstü bilgisayarlar ve tabletler için çok kötüdür. Uygulamanızdan en iyi sonuçları almak için her iki yönü de desteklemeyi düşünün.

Bazı Android uygulamaları, bir cihaz dikey modda tutulduğunda rotasyon değerinin Surface.ROTATION_0 olduğunu varsayar. Bu durum çoğu Android cihaz için geçerli olabilir. Bununla birlikte, uygulama belirli bir ARC modundayken dikey yön için döndürme değeri Surface.ROTATION_0 olmayabilir.

İvme ölçer veya benzer sensörleri okurken doğru bir dönüş değeri elde etmek için Display.getRotation() yöntemini kullanın ve ekseni uygun şekilde değiştirin.

Kök etkinliği ve yönü

Bir Chromebook penceresi, bir dizi etkinlik penceresiden oluşur. Yığındaki her pencere aynı boyut ve yöne sahiptir.

Masaüstü ortamında ani yön ve boyut değişiklikleri kafa karıştırıcıdır. Chromebook pencere yöneticisi, Android'in yan yana moduna benzer bir şekilde bunu önler: Grubun alt kısmındaki etkinlik, üzerindeki tüm etkinliklerin özelliklerini kontrol eder. Bu durum, yeni başlatılan dikey ve yeniden boyutlandırılamayan bir etkinliğin yatay ve yeniden boyutlandırılabilir hale geldiği beklenmedik durumlara yol açabilir.

Cihaz modunun burada bir etkisi vardır: Tablet modunda yön kilitli olmaz ve her pencere, Android'de her zamanki gibi kendi yönünü korur.

Yön yönergeleri

İşleme yönü için aşağıdaki yönergeleri uygulayın:

  • Yalnızca bir yönü destekliyorsanız uygulamayı başlatmadan önce pencere yöneticisinin bundan haberdar olması için bilgileri manifest dosyasına ekleyin. Yönü belirtirken mümkünse sensör yönlerini de belirtin. Chromebook'lar genellikle dönüştürülebilir modellerdir ve ters çevrilmiş bir uygulama kötü bir kullanıcı deneyimi oluşturur.
  • Seçili tek bir yönde kalmaya çalışın. Manifest'te bir yön istemekten ve daha sonra programatik olarak başka bir yön belirlemekten kaçının.
  • Pencere boyutuna göre yönü değiştirirken dikkatli olun. Kullanıcı dikey boyuttaki küçük bir pencerede sıkışabilir ve daha büyük bir yatay pencereye dönemeyebilir.
  • Chrome'da, mevcut tüm düzenler arasında geçiş yapabileceğiniz pencere kontrolleri vardır. Doğru yön seçeneğini belirleyerek, kullanıcının uygulamayı başlattıktan sonra doğru düzene sahip olmasını sağlayabilirsiniz. Bir uygulama dikey ve yatay olarak kullanılabiliyorsa mümkünse varsayılan olarak yatay yapın. Bu seçenek ayarlandıktan sonra uygulama bazında hatırlanır.
  • Gereksiz yön değişikliklerinden kaçınmaya çalışın. Örneğin, etkinlik yönü dikeyse ancak uygulama, çalışma zamanında setRequestedOrientation(LANDSCAPE) yöntemini çağırırsa pencerenin gereksiz yeniden boyutlandırılmasına neden olur. Bu da kullanıcı için rahatsız edici olabilir ve uygulamanın işleyemeyeceği uygulamayı yeniden başlatabilir. Yönü, örneğin manifest'te bir kez ayarlamak ve yalnızca gerekliyse değiştirmek daha iyidir.

Dikkat edilmesi gereken diğer noktalar

ChromeOS'te Android uygulamalarıyla çalışırken göz önünde bulundurulması gereken diğer bazı noktalar şunlardır:

  • Etkinliğinizin onDestroy yönteminde finish() çağrısı yapmayın. Bu durum, yeniden boyutlandırma sonrasında uygulamanın kapanmasına ve yeniden başlatılmamasına neden olur.
  • TYPE_KEYGUARD ve TYPE_APPLICATION_MEDIA gibi uyumlu olmayan pencere türlerini kullanmayın.
  • Daha önce ayrılmış nesneleri önbelleğe alarak etkinliğin yeniden başlatılmasını sağlayın.
  • Kullanıcının uygulamanızı yeniden boyutlandırmasını istemiyorsanız manifest dosyanızda android:resizeableActivity=false değerini belirtin.
  • Uygulamanızı test ederek, pencere boyutundaki değişiklikleri doğru bir şekilde işlediğinden emin olun.