與資訊方塊互動

如果想進一步改善資訊方塊的使用體驗,不妨為其增添互動功能。將 Clickable 修飾詞新增到資訊方塊中的版面配置元素,即可在使用者輕觸該版面配置元素時做出回應。

本頁列出使用者經常在互動式資訊方塊中執行的幾項動作,並附上指引說明如何在應用程式的資訊方塊中實作上述行為。

載入新的資訊方塊版面配置

當使用者輕觸互動式元素時,請使用 LoadAction 重新整理資訊方塊的版面配置。

在下列程式碼片段中,setId() 當中設定的可按式 ID 會傳遞到 onTileRequest() 呼叫內,讓您可以按照這個 ID 轉譯其他版面配置:

override fun onTileRequest(requestParams: TileRequest) = Futures.immediateFuture(
    Tile.Builder()
        .setResourcesVersion("1")
        .setTileTimeline(Timeline.fromLayoutElement(
            when(requestParams.currentState.lastClickableId) {
                "foo" -> myFooLayout()
                else -> myOtherLayout()
            }
        )).build()
)

更新資訊方塊內的狀態

如果資訊方塊中的互動式元素有多種可能的狀態,請使用 LoadAction 顯示元素的新值。在下列程式碼片段中,資訊方塊會顯示核取方塊的更新值:

private fun checkboxChip(
    checkboxValue: Boolean,
    deviceParameters: DeviceParametersBuilders.DeviceParameters
): Chip =
    Chip.Builder(
            context,
            Clickable.Builder()
                .setOnClick(LoadAction.Builder()
                    .build()
                ).build(),
            deviceParameters
        ).setIconContent(if (checkboxValue) "check" else "checkoff")
        // Set checkbox labels and colors here.
        .build()

要求重新整理資訊方塊內容

如想要求更新資訊方塊的整體內容,請使用 LoadAction 並更新資訊方塊的要求狀態,如以下程式碼片段所示。

private fun tappableElement(): LayoutElement =
    Button.Builder(this, Clickable.Builder()
            .setId("foo")
            .setOnClick(LoadAction.Builder()
                .setRequestState(
                    StateBuilders.State.Builder()
                        /* Update state information here. */
                        .build()
                ).build()
            ).build())
        .setTextContent("Tap me!")
        .build()

如要使用深層連結載入活動,請將可點選的元素與 LoadAction 物件建立關聯:

private fun tappableElement(): LayoutElement =
    Text.Builder()
        .setText("Tap me!")
        .setModifiers(Modifiers.Builder()
            .setClickable(Clickable.Builder()
                .setId("foo")
                .setOnClick(LoadAction.Builder().build())
                .build()
            ).build()
        ).build()

接著,在 onTileRequest() 方法中,使用 TaskStackBuilder 物件做為輔助:

override fun onTileRequest(requestParams: TileRequest): ListenableFuture<TileBuilders.Tile> {
    val lastClickableId = requestParams.currentState.lastClickableId
    if (lastClickableId == "foo") {
      TaskStackBuilder.create(this)
        .addNextIntentWithParentStack(Intent(
            Intent.ACTION_VIEW,
            "https://www.example.com/$lastClickableId".toUri(),
            context,
            MyWearOsAppActivity::class.java
        ))
        .startActivities()
    }
    // The user clicked somewhere else on the tile instead.
}

載入匯出的活動

如要依據類別名稱,並透過意圖額外項目載入匯出的活動,請使用 LaunchAction

private fun tappableElement(): LayoutElement =
    Text.Builder(this, "Tap me!")
        .setModifiers(Modifiers.Builder()
            .setClickable(Clickable.Builder()
                .setId("foo")
                .setOnClick(ActionBuilders.launchAction(
                    ComponentName("my.package.name", "MyActivity")
                )).build()
            ).build()
        ).build()

如以下範例所示,您可以在啟動的活動內擷取資訊方塊使用的 ID:

class MyActivity : FragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val clickableId =
            intent.getStringExtra(TileService.EXTRA_CLICKABLE_ID)
        // clickableId will be "foo" when launched from the Tile
    }
}