レイアウト要素に Clickable
修飾子を追加すると、そのレイアウト要素をタップしたユーザーに反応できます。クリック イベントへの反応として、次の 2 つのアクションを実行できます。
LaunchAction
:AndroidManifest.xml
でandroid: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()); }