Kartları kullanma

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:

  1. Etkinliği doğrudan başlatma: Bir etkinliği hemen açmanız gerektiğinde launchAction() simgesini kullanın.
  2. Kart hizmetinize yetki verme: TileService içinde mantığı tetiklemek için loadAction() 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:

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.

Ardından TileActivity'te gezinme menüsünü googleandroidsnippets://app/message_detail/{id} deseniyle eşleşecek şekilde yapılandırın.

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")]
    }

    // ...
}