Wear OS cihazlarda kartlar, bağımsız sürümlere sahip iki temel bileşen tarafından oluşturulur. Uygulama karolarınızın tüm cihazlarda düzgün çalışmasını sağlamak için bu temel mimariyi anlamanız önemlidir.
- Jetpack kartlarıyla ilgili kitaplıklar: Bu kitaplıklar (Wear Kartları ve Wear ProtoLayout dahil) uygulamanıza yerleştirilir ve geliştirici olarak sürümlerini siz kontrol edersiniz. Uygulamanız, sistemdeki
onTileRequest()
çağrısına yanıt olarak birTileBuilder.Tile
nesnesi (Kartınızı temsil eden veri yapısı) oluşturmak için bu kitaplıkları kullanır. - ProtoLayout Oluşturucu: Bu sistem bileşeni,
Tile
nesnesini ekranda oluşturmaktan ve kullanıcı etkileşimlerini yönetmekten sorumludur. Oluşturucunun sürümü, uygulama geliştirici tarafından kontrol edilmez ve aynı donanıma sahip cihazlar arasında bile değişiklik gösterebilir.
Kartın görünümü veya davranışı hem uygulamanızın Jetpack Kartlar kitaplığı sürümlerine hem de kullanıcının cihazındaki ProtoLayout Oluşturucu sürümüne göre değişiklik gösterebilir. Örneğin, bir cihaz döndürme veya nabız verilerinin görüntülenmesini desteklerken başka bir cihaz bu özellikleri desteklemeyebilir.
Bu dokümanda, uygulamanızın Tiles kitaplığının ve ProtoLayout Oluşturucu'nun farklı sürümleriyle uyumlu olmasını sağlamanın yanı sıra daha yeni Jetpack kitaplığı sürümlerine nasıl geçeceğiniz açıklanmaktadır.
Uyumluluğu göz önünde bulundurun
Çeşitli cihazlarda düzgün çalışan bir Kart oluşturmak için aşağıdakileri göz önünde bulundurmanız gerekir.
Oluşturucu sürümünü algılama
- onTileRequest() yönteminize iletilen
DeviceParameters
nesnesiningetRendererSchemaVersion()
yöntemini kullanın. Bu yöntem, cihazdaki ProtoLayoutRenderer'ın ana ve alt sürüm numaralarını döndürür. - Ardından, Kartınızın tasarımını veya davranışını algılanan oluşturma aracı sürümüne göre uyarlamak için
onTileRequest()
uygulamanızda koşullu mantık kullanabilirsiniz.- Örneğin, belirli bir animasyon desteklenmiyorsa bunun yerine statik bir resim gösterebilirsiniz.
@RequiresSchemaVersion
ek açıklaması
- ProtoLayout yöntemlerindeki
@RequiresSchemaVersion
ek açıklaması, söz konusu yöntemin açıklandığı şekilde davranması için gereken minimum oluşturma şeması sürümünü belirtir (örnek).- Cihazda mevcut olandan daha yüksek bir oluşturma aracı sürümü gerektiren bir yöntemi çağırmak uygulamanızın kilitlenmesine neden olmaz ancak içeriğin görüntülenmemesine veya özelliğin yoksayılmasına neden olabilir.
Örnek
override fun onTileRequest(
requestParams: TileService.TileRequest
): ListenableFuture<Tile> {
val rendererVersion =
requestParams.deviceConfiguration.rendererSchemaVersion
val tile = Tile.Builder()
if (
rendererVersion.major > 1 ||
(rendererVersion.major == 1 && rendererVersion.minor >= 300)
) {
// Use a feature supported in renderer version 1.300 or later
tile.setTileTimeline(/* ... */ )
} else {
// Provide fallback content for older renderers
tile.setTileTimeline(/* ... */ )
}
return Futures.immediateFuture(tile.build())
}
Farklı oluşturma aracı sürümleriyle test etme
Kartlarınızı farklı oluşturma aracı sürümleriyle test etmek için Wear OS emülatörünün farklı sürümlerine dağıtın. (Fiziksel cihazlarda ProtoLayout Oluşturucu güncellemeleri Play Store veya sistem güncellemeleri tarafından yayınlanır. Belirli bir oluşturma aracı sürümünün yüklenmesini zorunlu kılmak mümkün değildir.)
Android Studio'nun Kart Önizleme özelliği, kodunuzun bağlı olduğu Jetpack ProtoLayout kitaplığına yerleştirilmiş bir oluşturma aracı kullanır. Bu nedenle, kartları test ederken farklı Jetpack kitaplığı sürümlerine bağlı olmak da bir yaklaşımdır.
Kartlar 1.5 / ProtoLayout 1.3'e (Material 3 Expressive) taşıma
Kartlarınızın sisteme sorunsuz bir şekilde entegre olmasını sağlayacak kullanıcı arayüzü değişiklikleri de dahil olmak üzere en son geliştirmelerden yararlanmak için Jetpack Kart kitaplıklarınızı güncelleyin.
Jetpack Tiles 1.5 ve Jetpack ProtoLayout 1.3, dikkate değer birkaç iyileştirme ve değişiklik içeriyor. Bunlardan bazıları:
- Kullanıcı arayüzünü açıklamak için Compose benzeri bir API.
- Alt kenar düğmesi ve gelişmiş görseller için destek dahil olmak üzere Material 3 Expressive bileşenleri: Lottie animasyonları, daha fazla degrade türü ve yeni yay çizgisi stilleri. - Not: Bu özelliklerin bazıları yeni API'ye taşınmadan da kullanılabilir.
Öneriler
- Tüm kartlarınızı aynı anda taşıyabilirsiniz. Uygulamanızda farklı karo sürümlerini karıştırmaktan kaçının. Material 3 bileşenleri ayrı bir yapıda (
androidx.wear.protolayout:protolayout-material3
) bulunduğundan, aynı uygulamada hem M2.5 hem de M3 karolarını teknik olarak kullanmak mümkün olsa da, kesinlikle gerekli olmadığı sürece (örneğin, uygulamanızda bir kerede taşınamayan çok sayıda karo varsa) bu yaklaşımı kesinlikle önermeyiz. - Kartlar kullanıcı deneyimi kılavuzunu uygulayın. Kartların son derece yapılandırılmış ve şablonlu yapısı göz önüne alındığında, kendi tasarımlarınız için başlangıç noktası olarak mevcut örneklerdeki tasarımları kullanın.
- Çeşitli ekran ve yazı tipi boyutlarında test edin. Kartlar genellikle bilgi bakımından yoğundur. Bu nedenle metin (özellikle düğmelere yerleştirildiğinde) taşmaya ve kırpılmaya eğilimlidir. Bu sorunu en aza indirmek için önceden oluşturulmuş bileşenleri kullanın ve kapsamlı özelleştirmelerden kaçının. Android Studio'nun karo önizleme özelliğini ve birden fazla gerçek cihazı kullanarak test edin.
Taşıma süreci
Bağımlılıkları güncelleme
Öncelikle build.gradle.kts
dosyanızı güncelleyin. Sürümleri güncelleyin ve protolayout-material
bağımlılığını aşağıdaki gibi protolayout-material3
olarak değiştirin:
// In build.gradle.kts
//val tilesVersion = "1.4.1"
//val protoLayoutVersion = "1.2.1"
// Use these versions for M3.
val tilesVersion = "1.5.0-rc01"
val protoLayoutVersion = "1.3.0-rc01"
dependencies {
// Use to implement support for wear tiles
implementation("androidx.wear.tiles:tiles:$tilesVersion")
// Use to utilize standard components and layouts in your tiles
implementation("androidx.wear.protolayout:protolayout:$protoLayoutVersion")
// Use to utilize components and layouts with Material Design in your tiles
// implementation("androidx.wear.protolayout:protolayout-material:$protoLayoutVersion")
implementation("androidx.wear.protolayout:protolayout-material3:$protoLayoutVersion")
// Use to include dynamic expressions in your tiles
implementation("androidx.wear.protolayout:protolayout-expression:$protoLayoutVersion")
// Use to preview wear tiles in your own app
debugImplementation("androidx.wear.tiles:tiles-renderer:$tilesVersion")
// Use to fetch tiles from a tile provider in your tests
testImplementation("androidx.wear.tiles:tiles-testing:$tilesVersion")
}
TileService büyük ölçüde değişmeden kalır
Bu taşıma işleminde yapılan başlıca değişiklikler kullanıcı arayüzü bileşenlerini etkiler. Sonuç olarak, tüm kaynak yükleme mekanizmaları dahil olmak üzere TileService
uygulamanız için çok az veya hiç değişiklik gerekmemelidir.
Ana istisna, kart etkinliği izlemeyle ilgilidir: Uygulamanız onTileEnterEvent()
veya onTileLeaveEvent()
kullanıyorsa onRecentInteractionEventsAsync()
'e geçmeniz gerekir. API 36'dan itibaren bu etkinlikler toplu olarak gönderilecek.
Düzen oluşturma kodunuzu uyarlama
ProtoLayout 1.2'de (M2.5) onTileRequest()
yöntemi bir TileBuilders.Tile
döndürür. Bu nesne, bir TimelineBuilders.Timeline
de dahil olmak üzere çeşitli öğeler içeriyordu. TimelineBuilders.Timeline
, kartın kullanıcı arayüzünü açıklayan LayoutElement
öğesini içeriyordu.
ProtoLayout 1.3 (M3) ile genel veri yapısı ve akışı değişmese de LayoutElement
artık Compose'dan esinlenen bir yaklaşımla oluşturuluyor. Bu yaklaşımda, tanımlanmış slotlara dayalı bir düzen kullanılıyor. Bu slotlar (üstten alta) titleSlot
(genellikle birincil başlık veya üstbilgi için), mainSlot
(temel içerik için) ve bottomSlot
(genellikle kenar düğmesi gibi işlemler veya kısa metin gibi ek bilgiler için) şeklindedir. Bu düzen, primaryLayout()
işlevi tarafından oluşturulur.

M2.5 ve M3 düzen işlevlerinin karşılaştırması
M2.5
fun myLayout(
context: Context,
deviceConfiguration: DeviceParametersBuilders.DeviceParameters
) =
PrimaryLayout.Builder(deviceConfiguration)
.setResponsiveContentInsetEnabled(true)
.setContent(
Text.Builder(context, "Hello World!")
.setTypography(Typography.TYPOGRAPHY_BODY1)
.setColor(argb(0xFFFFFFFF.toInt()))
.build()
)
.build()
M3
fun myLayout(
context: Context,
deviceConfiguration: DeviceParametersBuilders.DeviceParameters,
) =
materialScope(context, deviceConfiguration) {
primaryLayout(mainSlot = { text("Hello, World!".layoutString) })
}
Temel farklılıkları vurgulamak için:
- İnşaat ustalarının çıkarılması. Material3 kullanıcı arayüzü bileşenleri için geleneksel oluşturucu deseni, daha açıklayıcı ve Compose'dan ilham alan bir söz dizimi ile değiştirildi. (String/Color/Değişkenler gibi kullanıcı arayüzü dışındaki bileşenler de yeni Kotlin sarmalayıcıları alır.)
- Standartlaştırılmış İlk Kullanıma Hazırlama ve Düzen İşlevleri. M3 düzenleri, standartlaştırılmış başlatma ve yapı işlevlerini kullanır:
materialScope()
veprimaryLayout()
. Bu zorunlu işlevler, M3 ortamını (materialScope
aracılığıyla tema, bileşen kapsamı) başlatır ve birincil yuvaya dayalı düzeni (primaryLayout
aracılığıyla) tanımlar. Her ikisi de düzen başına tam olarak bir kez çağrılmalıdır.
Tema oluşturma
Renk
Material 3 Expressive'in öne çıkan özelliklerinden biri "dinamik temalandırma"dır: Bu özelliği etkinleştiren kartlar (varsayılan olarak açıktır) sistem tarafından sağlanan temada gösterilir (kullanılabilirlik, kullanıcının cihazına ve yapılandırmasına bağlıdır).
M3'teki bir diğer değişiklik de renk jetonu sayısının 4'ten 29'a çıkarılması oldu. Yeni renk jetonlarını ColorScheme
sınıfında bulabilirsiniz.
Yazı biçimi
M2.5'e benzer şekilde M3 de büyük ölçüde önceden tanımlanmış yazı tipi boyutu sabitlerine dayanır. Doğrudan yazı tipi boyutu belirtmeniz önerilmez. Bu sabitler Typography
sınıfında bulunur ve daha etkileyici seçenekler sunan biraz daha geniş bir yelpaze sunar.
Tüm ayrıntılar için Yazı biçimi dokümanlarına bakın.
Şekil
Çoğu M3 bileşeni, renk boyutunun yanı sıra şekil boyutunda da değişiklik gösterebilir.
full
şeklinde bir textButton
(mainSlot
içinde):

Aynı metin düğmesi, small
şeklinde:

Bileşenler
M3 bileşenleri, M2.5 bileşenlerine kıyasla çok daha esnek ve yapılandırılabilirdir. M2.5'te genellikle çeşitli görsel işlemler için farklı bileşenler gerekirken M3'te genellikle iyi varsayılan değerlere sahip genelleştirilmiş ancak yüksek oranda yapılandırılabilir bir "temel" bileşen kullanılır.
Bu ilke, "root" düzeni için geçerlidir. M2.5'te bu PrimaryLayout
veya EdgeContentLayout
idi. M3'te, tek bir üst düzey MaterialScope
oluşturulduktan sonra primaryLayout()
işlevi çağrılır. Bu yöntem, kök düzeni doğrudan döndürür (geliştirici gerekmez) ve titleSlot
, mainSlot
ve bottomSlot
gibi çeşitli "slotlar" için LayoutElements
değerini kabul eder. Bu yuvalar, text(), button() veya card() tarafından döndürülenler gibi belirli kullanıcı arayüzü bileşenleriyle ya da LayoutElementBuilders
'daki Row
veya Column
gibi düzen yapılarıyla doldurulabilir.
Temalar, M3'teki önemli bir iyileştirmeyi temsil eder. Kullanıcı arayüzü öğeleri varsayılan olarak M3 stil spesifikasyonlarına otomatik olarak uyar ve dinamik tema oluşturmayı destekler.
M2.5 | M3 |
---|---|
Etkileşimli Öğeler | |
Button veya Chip |
|
Metin | |
Text |
text() |
İlerleme Durumu Göstergeleri | |
CircularProgressIndicator |
circularProgressIndicator() veya segmentedCircularProgressIndicator() |
Düzen | |
PrimaryLayout veya EdgeContentLayout |
primaryLayout() |
— | buttonGroup() |
Görseller | |
— | icon() , avatarImage() veya backgroundImage() |
Değiştiriciler
M3'te, bir bileşeni süslemek veya genişletmek için kullandığınız Modifiers
, Compose'a daha benzer. Bu değişiklik, uygun dahili türleri otomatik olarak oluşturarak standart metinlerin sayısını azaltabilir. (Bu değişiklik, M3 kullanıcı arayüzü bileşenlerinin kullanımına paraleldir. Gerekirse ProtoLayout 1.2'deki oluşturucu stili değiştiricileri M3 kullanıcı arayüzü bileşenleriyle ve bunun tam tersini kullanabilirsiniz.)
M2.5
// A Builder-style modifier to set the opacity of an element to 0.5
fun myModifier(): ModifiersBuilders.Modifiers =
ModifiersBuilders.Modifiers.Builder()
.setOpacity(TypeBuilders.FloatProp.Builder(0.5F).build())
.build()
M3
// The equivalent Compose-like modifier is much simpler
fun myModifier(): LayoutModifier = LayoutModifier.opacity(0.5F)
Değiştiricileri API stilini kullanarak oluşturabilir ve LayoutModifier
öğesini ModifiersBuilders.Modifier
öğesine dönüştürmek için toProtoLayoutModifiers()
uzantı işlevini de kullanabilirsiniz.
Yardımcı İşlevler
ProtoLayout 1.3, birçok kullanıcı arayüzü bileşeninin Compose'dan ilham alan bir API kullanılarak ifade edilmesine olanak tanısa da LayoutElementBuilders
'teki satır ve sütun gibi temel düzen öğeleri, oluşturucu kalıbını kullanmaya devam eder. Bu üslup farkını gidermek ve yeni M3 bileşen API'leriyle tutarlılık sağlamak için yardımcı işlevler kullanabilirsiniz.
Yardımcı olmadan
primaryLayout(
mainSlot = {
LayoutElementBuilders.Column.Builder()
.setWidth(expand())
.setHeight(expand())
.addContent(text("A".layoutString))
.addContent(text("B".layoutString))
.addContent(text("C".layoutString))
.build()
}
)
Yardımcı ile
// Function literal with receiver helper function
fun column(builder: Column.Builder.() -> Unit) =
Column.Builder().apply(builder).build()
primaryLayout(
mainSlot = {
column {
setWidth(expand())
setHeight(expand())
addContent(text("A".layoutString))
addContent(text("B".layoutString))
addContent(text("C".layoutString))
}
}
)
Kartlar 1.2 / ProtoLayout 1.0'a taşıma
1.2 sürümü itibarıyla çoğu Kart düzeni API'si androidx.wear.protolayout
ad alanındadır. En son API'leri kullanmak için kodunuzda aşağıdaki taşıma adımlarını tamamlayın.
Bağımlılıkları güncelleme
Uygulama modülünüzün derleme dosyasında aşağıdaki değişiklikleri yapın:
Groovy
// Removeimplementation 'androidx.wear.tiles:tiles-material:version'// Include additional dependencies implementation "androidx.wear.protolayout:protolayout:1.2.1" implementation "androidx.wear.protolayout:protolayout-material:1.2.1" implementation "androidx.wear.protolayout:protolayout-expression:1.2.1" // Update implementation "androidx.wear.tiles:tiles:1.4.1"
Kotlin
// Removeimplementation("androidx.wear.tiles:tiles-material:version")// Include additional dependencies implementation("androidx.wear.protolayout:protolayout:1.2.1") implementation("androidx.wear.protolayout:protolayout-material:1.2.1") implementation("androidx.wear.protolayout:protolayout-expression:1.2.1") // Update implementation("androidx.wear.tiles:tiles:1.4.1")
Ad alanlarını güncelleme
Uygulamanızın Kotlin ve Java tabanlı kod dosyalarında aşağıdaki güncellemeleri yapın. Alternatif olarak bu ad alanını yeniden adlandırma komut dosyasını da çalıştırabilirsiniz.
- Tüm
androidx.wear.tiles.material.*
içe aktarma işlemleriniandroidx.wear.protolayout.material.*
ile değiştirin. Bu adımıandroidx.wear.tiles.material.layouts
kitaplığı için de tamamlayın. Diğer
androidx.wear.tiles.*
içe aktarma işlemlerinin çoğunuandroidx.wear.protolayout.*
ile değiştirin.androidx.wear.tiles.EventBuilders
,androidx.wear.tiles.RequestBuilders
,androidx.wear.tiles.TileBuilders
veandroidx.wear.tiles.TileService
için içe aktarma işlemleri aynı kalacak.Desteği sonlandırılan TileService ve TileBuilder sınıflarındaki birkaç yöntemi yeniden adlandırın:
TileBuilders
:getTimeline()
-getTileTimeline()
vesetTimeline()
-setTileTimeline()
arasıTileService
:onResourcesRequest()
,onTileResourcesRequest()
olarak değiştirildiRequestBuilders.TileRequest
:getDeviceParameters()
-getDeviceConfiguration()
,setDeviceParameters()
-setDeviceConfiguration()
,getState()
-getCurrentState()
vesetState()
-setCurrentState()