与磁贴互动

您可以通过使其具有交互性来进一步增强磁贴体验。通过将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.
}

加载导出的活动

要通过类名和 Intent 附加数据加载导出的活动,请使用 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
    }
}