您可以通过使磁贴可互动来进一步增强其体验。通过将 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()
使用深层链接加载 Activity
如需使用深层链接加载 Activity,请将可点击元素与 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.
}
加载导出的 Activity
如需按类名并使用 intent extras 加载导出的 Activity,请使用 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()
在启动的 Activity 中,您可以检索用于磁贴的 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
}
}
为您推荐
- 注意:当 JavaScript 关闭时,会显示链接文本
- 在 Wear OS 中创建您的第一个磁贴
- 迁移到 ProtoLayout 命名空间
- 在磁贴中显示动态更新