タイルを操作する

レイアウト要素に Clickable 修飾子を追加すると、そのレイアウト要素をタップしたユーザーに反応できます。クリック イベントへの反応として、次の 2 つのアクションを実行できます。

  • LaunchAction: AndroidManifest.xmlandroid:exported="true" として明示的に宣言されたアクティビティを起動する。
  • LoadAction: onTileRequest() を呼び出して、タイルを強制的に更新する。

LaunchAction を設定するには、次のコードサンプルに示すように、ユーザーが要素をタップしたときに起動するアクティビティのクラス名とパッケージ名を渡します。

Kotlin

private fun tappableElement(): LayoutElement =
    Text.Builder()
        .setText("Tap me!")
        .setModifiers(Modifiers.Builder()
            .setClickable(Clickable.Builder()
                .setId("foo")
                .setOnClick(LaunchAction.Builder()
                    .setAndroidActivity(AndroidActivity.Builder()
                        .setClassName(MyActivity::class.java.getName())
                        .setPackageName(this.packageName)
                        .build()
                    ).build()
                ).build()
            ).build()
        ).build()

Java

private LayoutElement tappableElement() {
    return new Text.Builder()
        .setText("Tap me!")
        .setModifiers(new Modifiers.Builder()
            .setClickable(new Clickable.Builder()
                .setId("foo")
                .setOnClick(new LaunchAction.Builder()
                    .setAndroidActivity(new AndroidActivity.Builder()
                        .setClassName(MyActivity.class.getName())
                        .setPackageName(this.getPackageName())
                        .build()
                    ).build()
                ).build()
            ).build()
        ).build();
}

次の例に示すように、起動されたアクティビティ内で、タイルに使用された ID を取得できます。

Kotlin

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
    }
}

Java

public class MyActivity extends FragmentActivity {
   @Override
   public void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       String clickableId =
           getIntent().getStringExtra(TileService.EXTRA_CLICKABLE_ID);
       // clickableId will be "foo" when launched from the Tile
   }
}

あるいは、次のコードサンプルに示すように、LoadAction を使用して、ユーザーがレイアウト要素をタップしたときにタイルを更新します。

Kotlin

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

Java

private LayoutElement tappableElement() {
    return new Text.Builder()
        .setText("Tap me!")
        .setModifiers(new Modifiers.Builder()
            .setClickable(new Clickable.Builder()
                .setId("foo")
                .setOnClick(new LoadAction.Builder().build())
                .build()
            ).build()
        ).build()
}

この場合、setId() で設定したクリック可能 ID が onTileRequest() 呼び出しに渡されるため、次のコードサンプルに示すように、この ID に基づいて異なるレイアウトをレンダリングできます。

Kotlin

override fun onTileRequest(requestParams: TileRequest) = Futures.immediateFuture(
    Tile.Builder()
        .setResourcesVersion("1")
        .setTimeline(Timeline.Builder()
            .addTimelineEntry(TimelineEntry.Builder()
                .setLayout(Layout.Builder()
                    .setRoot(
                        when(requestParams.state.lastClickableId) {
                            "foo" -> myFooLayout()
                            else -> myOtherLayout()
                        }
                    ).build()
                ).build()
            ).build()
        ).build()
)

Java

@NonNull
@Override
protected ListenableFuture<Tile> onTileRequest(
   @NonNull TileRequest requestParams
) {
    LayoutElement root;
    if(requestParams.getState().getLastClickableId().equals("foo")) {
        root = myFooLayout();
    } else {
        root = myOtherLayout();
    }
    return Futures.immediateFuture(new Tile.Builder()
        .setResourcesVersion("1")
        .setTimeline(new Timeline.Builder()
            .addTimelineEntry(TimelineEntry.Builder()
                .setLayout(Layout.Builder()
                    .setRoot(root)
                    .build()
                ).build()
            ).build()
        ).build());
}