Kartlar, bilgi görüntülemekten daha fazlasını yapabilir ve etkileşimli olabilir.
textButton()
gibi bir öğenin dokunmalara yanıt vermesini sağlamak için clickable()
kullanarak bir tıklama işleyici oluşturun ve bu işleyiciyi düzen öğesiyle ilişkilendirin.
Bir Clickable
öğesini, işlem tetiklemesi için iki temel şekilde yapılandırabilirsiniz:
- Etkinliği doğrudan başlatma: Bir etkinliği hemen açmanız gerektiğinde
launchAction()
simgesini kullanın. - Kart hizmetinize yetki verme:
TileService
içinde mantığı tetiklemek içinloadAction()
kullanın. Bu, kartın içeriğini yenilemenize, durumunu güncellemenize veya daha karmaşık bir etkinlik başlatmanıza olanak tanıyan daha esnek bir yaklaşımdır.
Dışa aktarılan bir etkinliği başlatma
Kullanıcının dokunması, etkinliğin hemen başlatılmasını gerektiriyorsa launchAction()
simgesini kullanın.
Etkinliği tanımlamak için bir ComponentName
sağlayın. Etkinlik dışa aktarılmalıdır. Bu yaklaşımla, işlemle birlikte Intent
ekstra geçirebilirsiniz.
Ancak özel Intent
işaretleri ayarlamak mümkün değildir.
Aşağıdaki örnekte, name
ve age
olmak üzere iki ekstrayla TileActivity
'ü başlatmak için nasıl Clickable
oluşturulacağı gösterilmektedir:
textButton( labelContent = { text("launchAction()".layoutString, typography = BODY_LARGE) }, onClick = clickable( action = launchAction( ComponentName( "com.example.wear", "com.example.wear.snippets.m3.tile.TileActivity", ), mapOf( "name" to ActionBuilders.stringExtra("Bartholomew"), "age" to ActionBuilders.intExtra(21), ), ) ), )
Başlatılan etkinlikte, intent ekstralarından değerleri alın:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // When this activity is launched from the tile InteractionLaunchAction, // "name" will be "Bartholomew" and "age" will be 21 val name = intent.getStringExtra("name") val age = intent.getStringExtra("age") // ... }
Kart hizmetinizdeki etkileşimleri yönetme
Daha esnek etkileşimler için loadAction()
öğesini kullanın. Kullanıcı loadAction
ile yapılandırılmış bir öğeye dokunduğunda sistem, TileService.onTileRequest()
öğenizi yeniden çağırır. Bu sayede, hizmetinizde mantık çalıştırarak karoyu güncelleyebilir, durumunu değiştirebilir ve daha karmaşık görevler gerçekleştirebilirsiniz.
Kutu içeriğini yenileme
loadAction
'ün en basit kullanımı, yenileme sinyali göndermektir. loadAction
işlevini bağımsız değişken olmadan çağırın. Sisteme dokunulduğunda onTileRequest()
çağrılır. Bu sayede hizmetiniz, güncellenmiş içerik içeren yeni bir düzen döndürebilir.
textButton( onClick = clickable(loadAction()), labelContent = { text("Refresh".layoutString) }, )
Birden fazla etkileşimli öğeyi birbirinden ayırt etme
Kartınız birden fazla etkileşimli öğe içeriyorsa bir kimliği Clickable
değiştiricisiyle ilişkilendirebilirsiniz:
textButton( labelContent = { text("Deep Link me!".layoutString, typography = BODY_LARGE) }, onClick = clickable(id = "foo", action = loadAction()), )
onTileRequest()
içinde, hangi işlemin yapılacağına karar vermek için requestParams.currentState.lastClickableId
'u kullanarak bu kimliği kontrol edebilirsiniz.
Örnek: Derin bağlantı içeren bir etkinlik başlatma
Bu kalıp, derin bağlantı içeren bir etkinlik başlatmak için idealdir. Kullanıcı dokunuşuyla kart yeniden yüklenir, hizmetiniz kimliği inceler ve yeni etkinliği başlatır. Kullanıcıya daha iyi bir gezinme deneyimi sunmak için geri yığınını kontrol etmek üzere TaskStackBuilder
kullanın. Kullanıcı öğeye dokunduğunda doğrudan derin bağlantılı ekrana (örnekteki message_detail/1
ekranı) yönlendirilir. .addNextIntentWithParentStack()
kullanıldığı için üst etkinlik de arka yığına eklenir. Bu, kullanıcı geri kaydırdığında hemen karttan çıkmak yerine uygulamanın ana ekranına (örnekte MessageList
) gideceği anlamına gelir. İkinci kez geri kaydırarak kullanıcıları kartlara geri döndürebilirsiniz.
override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile?> { val lastClickableId = requestParams.currentState.lastClickableId if (lastClickableId == "foo") { TaskStackBuilder.create(this) .addNextIntentWithParentStack( Intent( Intent.ACTION_VIEW, "googleandroidsnippets://app/message_detail/1".toUri(), this, TileActivity::class.java, ) ) .startActivities() } // ... User didn't tap a button (either first load or tapped somewhere else) // ... }
Ardından TileActivity
'te gezinme menüsünü googleandroidsnippets://app/message_detail/{id}
deseniyle eşleşecek şekilde yapılandırın.
AppScaffold { val navController = rememberSwipeDismissableNavController() SwipeDismissableNavHost( navController = navController, startDestination = "message_list", ) { // ... composable( route = "message_detail/{id}", deepLinks = listOf( navDeepLink { uriPattern = "googleandroidsnippets://app/message_detail/{id}" } ), ) { val id = it.arguments?.getString("id") ?: "0" MessageDetails(details = "message $id") } } }
Kullanıcıya daha iyi bir gezinme deneyimi sunmak için TaskStackBuilder
kullanın.
Kullanıcı öğeye dokunduğunda doğrudan derin bağlantılı ekrana (bu örnekte message_detail/1
ekranı) yönlendirilir. .addNextIntentWithParentStack()
kullanıldığı için üst etkinlik de arka yığına eklenir. Bu, kullanıcı geri kaydırdığı takdirde hemen karttan çıkmak yerine uygulamanın ana ekranına (örnekte MessageList
) gideceği anlamına gelir. Ekranı ikinci kez kaydırarak öğeye geri dönebilirsiniz.
Kartta durumu güncelleme
Kartınızda, anahtar/değer çiftlerini depolayan ve yeniden yüklemelerde kalıcı olan bir StateBuilders.State
nesnesi vardır. Kullanıcı kartla etkileşime geçtiğinde bu durumu güncellemek için loadAction()
öğesini kullanabilirsiniz.
Bunu yapmak için yeni durum değerlerini içeren bir DynamicDataMap
öğesini loadAction()
'e gönderin.
textButton( labelContent = { text("loadAction()".layoutString, typography = BODY_LARGE) }, onClick = clickable( action = loadAction( dynamicDataMapOf( stringAppDataKey("name") mapTo "Javier", intAppDataKey("age") mapTo 37, ) ) ), )
onTileRequest()
bu işlem tarafından tetiklendiğinde, güncellenmiş verileri requestParams.currentState.stateMap
'dan okuyabilirsiniz. Bu, bir sayıyı artırma veya bir ayarı değiştirme gibi, karttaki verileri doğrudan değiştiren etkileşimler için yararlıdır.
override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile> { // When triggered by loadAction(), "name" will be "Javier", and "age" will // be 37. with(requestParams.currentState.stateMap) { val name = this[stringAppDataKey("name")] val age = this[intAppDataKey("age")] } // ... }