与卡片互动

向布局元素添加 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());
}