Pencere yönetimi

ChromeOS, Android uygulamalarını birden fazla pencerede destekler. Sistem, uygulamaları Şekil 1'de gösterildiği gibi, boyutları cihazın form faktörüne göre belirlenen pencere kapsayıcılarına yerleştirir.

Farklı cihazlardaki bir uygulama penceresi.
Şekil 1.: Altyazı buraya girilir.

Şekil 1. Farklı cihazlardaki bir uygulama penceresi.

Farklı ekran boyutlarıyla uyumlu düzenler tasarlamak önemlidir. Farklı ekran boyutlarını desteklemek için Android yönergelerine uyarsanız uygulamanız ChromeOS'te çalışırken de sorunsuz çalışır.

Bu sayfada, uygulamanızın penceresinin doğru şekilde başlatılmasına, sorunsuz şekilde yeniden boyutlandırılmasına ve boyutu değiştiğinde tüm içeriğinin gösterilmesine nasıl yardımcı olacağınız açıklanmaktadır.

İlk lansman boyutu

Uygulamalar, ilk lansman boyutunu aşağıdaki şekillerde isteyebilir:

  • Yalnızca masaüstü ortamlarında başlatma boyutu kullanın. Bu, pencere yöneticisinin size uygun sınırları ve yönü vermesine yardımcı olur. Masaüstü modunda kullanıldığında tercihleri belirtmek için <activity> içine aşağıdaki meta etiketleri ekleyin:

    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowSize&#34;
               android:value=&#34;[phone|tablet|maximize]&#34; /&gt;
    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowOrientation&#34;
               android:value=&#34;[portrait|landscape]&#34; /&gt;
    
  • Statik başlatma sınırları kullanın. Aşağıdaki örnekte gösterildiği gibi, etkinliğinizin manifest girişinde <layout> kullanarak "sabit" bir başlangıç boyutu belirtin:

    &lt;layout android:defaultHeight=&#34;500dp&#34;
                android:defaultWidth=&#34;600dp&#34;
                android:gravity=&#34;top|end&#34;
                android:minHeight=&#34;450dp&#34;
                android:minWidth=&#34;300dp&#34; /&gt;
    
  • Dinamik başlatma sınırlarını kullanın. Bir etkinlik, yeni bir etkinlik oluştururken ActivityOptions.setLaunchBounds(Rect) oluşturup kullanabilir. Boş bir dikdörtgen belirterek uygulamanızın ekranı kaplamasını sağlayabilirsiniz.

Pencereleri yeniden boyutlandırma

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

Şekil 2.: Altyazı buraya girilir.

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

View sınıfı kullanılırken pencere yeniden boyutlandırmayı işlemek için iki seçenek vardır:

  • onConfigurationChanged(..) çağrısı yaparak yapılandırma değişikliklerine dinamik olarak yanıt verin. Örneğin, etkinliğin manifestine 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 başlıklı makaleyi inceleyin.
  • Sistemin etkinliği yeniden başlatmasına izin verin. Bu durumda, onSaveInstanceState uygulayın ve daha önce kaydedilmiş durumu geri yüklemek için ViewModel mimari bileşenini kullanın.

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

Pencere boyutları

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

Mevcut yapılandırmayı belirlemek için getResources().getConfiguration() geçerli etkinlikte çağrı yapın. Arka plan etkinliğinin veya sistem kaynağının yapılandırmasını kullanmayın. Arka plan etkinliğinin boyutu yoktur ve sistem yapılandırması, çakışan boyut ve yönlere sahip birden fazla pencere içerebilir. Bu nedenle, kullanılabilir veri ayıklanamaz.

Pencere boyutu ile ekran boyutunun aynı olmadığını unutmayın. Pencere boyutunu DP cinsinden almak için Activity.getResources().getConfiguration().screenWidth ve Activity.getResources().getConfiguration().screenHeight kullanın. Ekran boyutunu muhtemelen hiç kullanmanız gerekmez.

İçerik sınırları

Bir pencerenin içerik sınırları, yeniden boyutlandırıldıktan sonra değişebilir. Örneğin, pencere ekrana sığamayacak kadar büyürse uygulama tarafından kullanılan pencere içindeki alan değişebilir. Aşağıdaki yönergeleri izleyin:

  • Android'in düzen sürecini kullanan uygulamalar, mevcut alanda otomatik olarak düzenlenir.
  • Yerel uygulamaların, erişilemeyen kullanıcı arayüzü öğeleri olmaması için kullanılabilir alanı okuması ve boyut değişikliklerini izlemesi gerekir. Bu yüzey için başlangıçta kullanılabilir boyutu belirlemek üzere 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)) adlı gruba dinleyici ekleme

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

Serbest biçimli yeniden boyutlandırma

ChromeOS, tüm pencerelerin serbestçe yeniden boyutlandırılmasına olanak tanır. Kullanıcılar, pencerelerin genişliğini, yüksekliğini ve ekrandaki konumunu değiştirebilir. Birçok Android uygulaması, serbest yeniden boyutlandırma özelliği dikkate alınmadan yazılmıştır. Şu sorunları göz önünde bulundurun:

  • Ekran konumu değişebilir. Pencereden ekrana ve ekrandan pencereye koordinat dönüşümlerini gerçekleştirmek için her zaman sistemi 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ünüm sistemini kullanmıyor ve yüzeyi devralıyorsanız uygulamanız boyut değişikliklerini kendi başına yönetmelidir.
  • Yerel uygulamalar için mLastContent üyelerini kullanın veya başlangıç boyutunu belirlemek üzere 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 grafikleri yeniden ölçeklendirin veya yeniden yükleyin ve giriş alanlarını güncelleyin.

Tam ekran modu

Tam ekran modu, stok Android'de olduğu gibi çalışır. Pencere tam ekranı kaplamıyorsa tam ekran (tüm sistem kullanıcı arayüzü öğelerini gizleme) istekleri yoksayılır. Uygulama ekranı maksimize edildiğinde 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ü

Çoğu telefon bu şekilde tutulduğundan Android uygulamaları için en yaygın yönlendirme dikey yönlendirmedir. Dikey mod telefonlar için uygun olsa da yatay modun tercih edildiği dizüstü bilgisayarlar ve tabletler için uygun değildir. Uygulamanız için en iyi sonuçları elde etmek istiyorsanız her iki yönü de desteklemeyi düşünebilirsiniz.

Bazı Android uygulamaları, bir cihaz dikey modda tutulduğunda döndürme değerinin Surface.ROTATION_0 olduğunu varsayar. Bu durum çoğu Android cihaz için geçerli olabilir. Ancak 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 buna göre değiştirin.

Kök etkinlik ve yön

Chromebook penceresi, bir dizi etkinlik penceresinden oluşur. Gruptaki her pencere aynı boyuta ve yöne sahiptir.

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

Cihaz modu bu durumu etkiler: Tablet modunda yön kilitlenmez ve her pencere kendi yönünü korur (Android'de olduğu gibi).

Yönlendirme yönergeleri

Yönlendirmeyi işlemek için aşağıdaki yönergeleri uygulayın:

  • Yalnızca bir yönü destekliyorsanız pencere yöneticisinin uygulamayı başlatmadan önce bu konuda bilgi sahibi olması için bilgileri manifeste ekleyin. Yönü belirtirken mümkün olduğunda sensör yönlerini de belirtin. Chromebook'lar genellikle dönüştürülebilir cihazlardır ve uygulamanın ters dönmesi kötü bir kullanıcı deneyimidir.
  • Tek bir seçili yönlendirme kullanmaya çalışın. Manifest dosyasında bir yön isteğinde bulunup daha sonra programatik olarak başka bir yön ayarlamaktan kaçının.
  • Yönü pencere boyutuna göre değiştirirken dikkatli olun. Kullanıcı, küçük bir portre boyutundaki pencerede sıkışıp kalabilir ve daha büyük bir yatay pencereye dönemeyebilir.
  • Chrome'da, kullanılabilir tüm düzenler arasında geçiş yapabileceğiniz pencere kontrolleri bulunur. 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 hem dikey hem de yatay olarak kullanılabiliyorsa mümkünse varsayılan olarak yatay yönü ayarlayı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ü dikey olmasına rağmen uygulama çalışma zamanında setRequestedOrientation(LANDSCAPE) çağrısı yaparsa bu durum, gereksiz pencere yeniden boyutlandırmasına neden olur. Bu durum kullanıcıyı rahatsız eder ve uygulama bunu işleyemezse uygulamayı yeniden başlatabilir. Yönü bir kez ayarlamak (örneğin, manifest dosyasında) ve yalnızca gerekirse değiştirmek daha iyidir.

Dikkat edilmesi gereken diğer noktalar

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

  • Etkinliğinizin onDestroy yönteminde finish() yöntemini çağırmayın. Bu durum, yeniden boyutlandırma sırası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 etkinlik yeniden başlatmalarını hızlandırın.
  • Kullanıcının uygulamanızı yeniden boyutlandırmasını istemiyorsanız manifest dosyanızda android:resizeableActivity=false değerini belirtin.
  • Uygulamanızın pencere boyutundaki değişiklikleri uygun şekilde işlediğinden emin olmak için uygulamanızı test edin.