向布局元素添加 Clickable
修饰符,即可针对用户点按该布局元素的操作设置响应。为了响应点击事件,您可以执行两项操作:
LaunchAction
:启动在AndroidManifest.xml
中明确声明为android:exported="true"
的 activity。LoadAction
:强制刷新卡片,调用onTileRequest()
。
如需设置 LaunchAction
,请传递您希望在用户点按元素时启动的 activity 的类名称和软件包名称,如以下代码示例所示:
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(); }
在已启动的 activity 内,您可以检索为该卡片使用的 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()); }