タイルを操作する

タイルをインタラクティブにすることで、タイルのエクスペリエンスをさらに高めることができます。タイル内のレイアウト要素に 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
    }
}