Bu sayfada, Android 12'de (API düzeyi 31) sunulan widget boyutlandırması ve daha fazla esneklikle ilgili iyileştirmeler açıklanmaktadır. Ayrıca, Widget'ınız için boyut belirleme konusunda da ayrıntılı bilgi verilmektedir.
Widget boyutları ve düzenleri için geliştirilmiş API'leri kullanma
Android 12 (API düzeyi 31) sürümünden itibaren, aşağıdaki bölümlerde açıklandığı gibi aşağıdakileri yaparak daha hassas boyut özellikleri ve esnek düzenler sağlayabilirsiniz:
Android'in önceki sürümlerinde OPTION_APPWIDGET_MIN_WIDTH
, OPTION_APPWIDGET_MIN_HEIGHT
, OPTION_APPWIDGET_MAX_WIDTH
ve OPTION_APPWIDGET_MAX_HEIGHT
ekstralarını kullanarak widget'ın boyut aralıklarını elde etmek ve ardından widget'ın boyutunu tahmin etmek mümkündür ancak bu mantık her durumda işe yaramaz. Android 12 veya sonraki sürümleri hedefleyen widget'lar için duyarlı veya tam sayfa düzenler sağlamanızı öneririz.
Ek widget boyutu kısıtlamaları belirleme
Android 12'de, widget'ınızın çeşitli ekran boyutlarına sahip farklı cihazlarda daha güvenilir şekilde boyutlandırılmasını sağlayan API'ler bulunur.
Mevcut minWidth
,
minHeight
,
minResizeWidth
ve minResizeHeight
özelliklerine ek olarak aşağıdaki yeni appwidget-provider
özelliklerini kullanın:
targetCellWidth
vetargetCellHeight
: widget'ın hedef boyutunu başlatıcı ızgara hücreleri açısından tanımlar. Tanımlanmışsa bu özelliklerminWidth
veyaminHeight
yerine kullanılır.maxResizeWidth
vemaxResizeHeight
: Başlatıcının, kullanıcının widget'ı yeniden boyutlandırmasına izin verdiği maksimum boyutu tanımlar.
Aşağıdaki XML'de, boyutlandırma özelliklerinin nasıl kullanılacağı gösterilmektedir.
<appwidget-provider
...
android:targetCellWidth="3"
android:targetCellHeight="2"
android:maxResizeWidth="250dp"
android:maxResizeHeight="110dp">
</appwidget-provider>
Duyarlı düzenler sunma
Widget'ın boyutuna bağlı olarak düzenin değişmesi gerekiyorsa her biri belirli bir boyut aralığı için geçerli olan küçük bir düzen grubu oluşturmanızı öneririz. Bu mümkün değilse bu sayfada açıklandığı gibi çalışma zamanındaki tam widget boyutuna göre düzenler de sağlayabilirsiniz.
Bu özellik, widget'ı her farklı boyutta gösterdiğinde sistemin uygulamayı uyandırması gerekmediğinden daha sorunsuz ölçeklendirme ve genel olarak daha iyi sistem sağlığı sağlar.
Aşağıdaki kod örneğinde, düzenlerin nasıl sağlanacağı gösterilmektedir.
Kotlin
override fun onUpdate(...) { val smallView = ... val tallView = ... val wideView = ... val viewMapping: Map<SizeF, RemoteViews> = mapOf( SizeF(150f, 100f) to smallView, SizeF(150f, 200f) to tallView, SizeF(215f, 100f) to wideView ) val remoteViews = RemoteViews(viewMapping) appWidgetManager.updateAppWidget(id, remoteViews) }
Java
@Override public void onUpdate(...) { RemoteViews smallView = ...; RemoteViews tallView = ...; RemoteViews wideView = ...; Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); viewMapping.put(new SizeF(150f, 100f), smallView); viewMapping.put(new SizeF(150f, 200f), tallView); viewMapping.put(new SizeF(215f, 100f), wideView); RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews); }
Widget'ın aşağıdaki özelliklere sahip olduğunu varsayalım:
<appwidget-provider
android:minResizeWidth="160dp"
android:minResizeHeight="110dp"
android:maxResizeWidth="250dp"
android:maxResizeHeight="200dp">
</appwidget-provider>
Önceki kod snippet'i şu anlama gelir:
smallView
; 160 dp (minResizeWidth
) × 110 dp (minResizeHeight
) ila 160 dp × 199 dp (sonraki son sipariş noktası - 1 dp) boyutlarını destekler.tallView
, 160 dp × 200 dp ile 214 dp (sonraki kesme noktası - 1) × 200 dp arasında desteklenir.wideView
, 215 dp × 110 dp (minResizeHeight
) ila 250 dp (maxResizeWidth
) × 200 dp (maxResizeHeight
) boyutlarını destekler.
Widget'ınız minResizeWidth
× minResizeHeight
ile maxResizeWidth
× maxResizeHeight
arasındaki boyut aralığını desteklemelidir. Bu aralık içinde, düzen değiştirmek için kesme noktasına karar verebilirsiniz.
Tam düzenler sağlayın
Küçük bir duyarlı düzen grubu uygun değilse bunun yerine widget'ın gösterildiği boyutlara göre uyarlanmış farklı düzenler sağlayabilirsiniz. Bu genellikle telefonlar için iki boyut (dikey ve yatay mod) ve katlanabilir cihazlar için dört boyuttur.
Bu çözümü uygulamak için uygulamanızın aşağıdaki adımları gerçekleştirmesi gerekir:
Boyut grubu değiştiğinde çağrılan aşırı yükleme
AppWidgetProvider.onAppWidgetOptionsChanged()
.Boyutları içeren bir
Bundle
döndürenAppWidgetManager.getAppWidgetOptions()
işlevini çağırın.Bundle
'danAppWidgetManager.OPTION_APPWIDGET_SIZES
anahtarına erişin.
Aşağıdaki kod örneğinde, tam düzenlerin nasıl sağlanacağı gösterilmektedir.
Kotlin
override fun onAppWidgetOptionsChanged( context: Context, appWidgetManager: AppWidgetManager, id: Int, newOptions: Bundle? ) { super.onAppWidgetOptionsChanged(context, appWidgetManager, id, newOptions) // Get the new sizes. val sizes = newOptions?.getParcelableArrayList<SizeF>( AppWidgetManager.OPTION_APPWIDGET_SIZES ) // Check that the list of sizes is provided by the launcher. if (sizes.isNullOrEmpty()) { return } // Map the sizes to the RemoteViews that you want. val remoteViews = RemoteViews(sizes.associateWith(::createRemoteViews)) appWidgetManager.updateAppWidget(id, remoteViews) } // Create the RemoteViews for the given size. private fun createRemoteViews(size: SizeF): RemoteViews { }
Java
@Override public void onAppWidgetOptionsChanged( Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); // Get the new sizes. ArrayList<SizeF> sizes = newOptions.getParcelableArrayList(AppWidgetManager.OPTION_APPWIDGET_SIZES); // Check that the list of sizes is provided by the launcher. if (sizes == null || sizes.isEmpty()) { return; } // Map the sizes to the RemoteViews that you want. Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); for (SizeF size : sizes) { viewMapping.put(size, createRemoteViews(size)); } RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews); } // Create the RemoteViews for the given size. private RemoteViews createRemoteViews(SizeF size) { }
Widget'ınız için boyut belirleme
Her widget, Android 12 veya sonraki sürümleri çalıştıran cihazlar için bir targetCellWidth
ve targetCellHeight
(veya Android'in tüm sürümleri için minWidth
ve minHeight
) tanımlamalıdır. Bu değerler, widget'ın varsayılan olarak kapladığı minimum alanı belirtir. Ancak kullanıcılar ana ekranlarına widget eklediklerinde bu widget genellikle belirttiğiniz minimum genişlik ve yükseklikten daha fazla yer kaplar.
Android ana ekranları, kullanıcılara widget ve simge yerleştirebilecekleri kullanılabilir alanlar ızgaraları sunar. Bu ızgara cihaza göre değişiklik gösterebilir. Örneğin, birçok cep telefonu 5x4 ızgara sunarken tabletler daha büyük bir ızgara sunabilir. Widget'ınız eklendiğinde, Android 12 veya sonraki sürümleri çalıştıran cihazlarda targetCellWidth
ve targetCellHeight
, Android 11 (API düzeyi 30) veya önceki sürümleri çalıştıran cihazlarda ise minWidth
ve minHeight
kısıtlamalarını karşılamak için gereken minimum sayıda hücreyi yatay ve dikey olarak kaplayacak şekilde genişletilir.
Hücrenin genişliği ve yüksekliği ile widget'lara uygulanan otomatik kenar boşluklarının boyutu cihazlara bağlı olarak farklılık gösterebilir. İstediğiniz dolu hücre sayısına bağlı olarak, widget'ınızın tipik bir 5x4 ızgaralı cep telefonundaki minimum boyutlarını kabaca tahmin etmek için aşağıdaki tabloyu kullanın:
Hücre sayısı (genişlik x yükseklik) | Dikey modda kullanılabilir boyut (dp) | Yatay modda kullanılabilir boyut (dp) |
---|---|---|
1x1 | 57x102dp | 127x51dp |
2x1 | 130x102dp | 269x51dp |
3x1 | 203x102dp | 412x51dp |
4x1 | 276x102dp | 554x51dp |
5x1 | 349x102dp | 697x51dp |
5x2 | 349x220dp | 697x117dp |
5x3 | 349x337dp | 697x184dp |
5x4 | 349x455dp | 697x250dp |
... | ... | ... |
n x m | (73n - 16) x (118m - 16) | (142n - 15) x (66m - 15) |
minWidth
, minResizeWidth
ve maxResizeWidth
özellikleri için sağladığınız değerleri belirlemek üzere dikey mod hücre boyutlarını kullanın. Benzer şekilde, minHeight
, minResizeHeight
ve maxResizeHeight
özellikleri için sağladığınız değerleri bildirmek amacıyla yatay mod hücre boyutlarını kullanın.
Bunun nedeni, hücre genişliğinin genellikle dikey modda yatay moddan daha küçük olmasıdır. Benzer şekilde, hücre yüksekliği de genellikle yatay modda dikey moddan daha küçüktür.
Örneğin, widget'ınızın genişliğinin Google Pixel 4'te bir hücreye kadar küçültülebilir olmasını istiyorsanız minResizeWidth
özelliğinin değerinin 57 dp'den küçük olduğundan emin olmak için minResizeWidth
özelliğini en fazla 56 dp olarak ayarlamanız gerekir. Bunun nedeni, bir hücrenin dikey modda en az 57 dp genişliğinde olmasıdır.
Benzer şekilde, widget'ınızın yüksekliğinin aynı cihazdaki bir hücrede yeniden boyutlandırılabilir olmasını istiyorsanız minResizeHeight
özelliğinin değerinin 51 dp'den küçük olduğundan emin olmak için minResizeHeight
özelliğini en fazla 50 dp'ye ayarlamanız gerekir. Çünkü yatay modda bir hücre en az 51 dp yüksekliğindedir.
Her widget, minResizeWidth
/minResizeHeight
ve maxResizeWidth
/maxResizeHeight
özellikleri arasındaki boyut aralıkları içinde yeniden boyutlandırılabilir. Bu, widget'ın bu özellikler arasındaki tüm boyut aralıklarını uyum sağlaması gerektiği anlamına gelir.
Örneğin, yerleşimdeki widget'ın varsayılan boyutunu ayarlamak için aşağıdaki özellikleri ayarlayabilirsiniz:
<appwidget-provider
android:targetCellWidth="3"
android:targetCellHeight="2"
android:minWidth="180dp"
android:minHeight="110dp">
</appwidget-provider>
Bu, widget'ın varsayılan boyutunun targetCellWidth
ve targetCellHeight
özellikleri tarafından belirtildiği gibi 3x2 hücre olduğu veya Android 11 veya daha eski sürümleri çalıştıran cihazlar için minWidth
ve minHeight
tarafından belirtildiği gibi 180x110 dp olduğu anlamına gelir. İkinci durumda, hücrelerdeki boyut cihaza göre değişiklik gösterebilir.
Ayrıca, widget'ınızın desteklenen boyut aralıklarını ayarlamak için aşağıdaki özellikleri belirleyebilirsiniz:
<appwidget-provider
android:minResizeWidth="180dp"
android:minResizeHeight="110dp"
android:maxResizeWidth="530dp"
android:maxResizeHeight="450dp">
</appwidget-provider>
Önceki özelliklerde belirtildiği gibi, widget'ın genişliği 180 dp ile 530 dp arasında, yüksekliği ise 110 dp ile 450 dp arasında değiştirilebilir. Daha sonra widget, aşağıdaki koşullar mevcut olduğu sürece 3x2 boyutundan 5x2 hücrelere yeniden boyutlandırılabilir:
- Cihazınızda 5x4 ızgara olmalıdır.
- Hücre sayısı ile kullanılabilir boyut (dps cinsinden) arasındaki eşleme, bu sayfadaki minimum boyutların tahminini gösteren tabloda açıklanmıştır.
- Widget bu boyut aralığına uyum sağlar.
Kotlin
val smallView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_small) val mediumView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_medium) val largeView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_large) val viewMapping: Map<SizeF, RemoteViews> = mapOf( SizeF(180f, 110f) to smallView, SizeF(270f, 110f) to mediumView, SizeF(270f, 280f) to largeView ) appWidgetManager.updateAppWidget(appWidgetId, RemoteViews(viewMapping))
Java
RemoteViews smallView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_small); RemoteViews mediumView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_medium); RemoteViews largeView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_large); Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); viewMapping.put(new SizeF(180f, 110f), smallView); viewMapping.put(new SizeF(270f, 110f), mediumView); viewMapping.put(new SizeF(270f, 280f), largeView); RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews);
Widget'ın, önceki kod snippet'lerinde tanımlanan duyarlı düzenleri kullandığını varsayalım. Bu, R.layout.widget_weather_forecast_small
olarak belirtilen düzenin 180dp (minResizeWidth
) x 110dp (minResizeHeight
) ile 269x279dp (sonraki kesme noktaları - 1) arasında kullanılacağı anlamına gelir. Benzer şekilde, R.layout.widget_weather_forecast_medium
270x110 dp ile 270x279 dp arasında, R.layout.widget_weather_forecast_large
ise 270x280 dp ile 530 dp (maxResizeWidth
) x 450 dp (maxResizeHeight
) arasında kullanılır.
Kullanıcı widget'ı yeniden boyutlandırdıkça görünümü, aşağıdaki örneklerde gösterildiği gibi hücrelerdeki her boyuta uyacak şekilde değişir.