Android NDK开发详解Wear之与功能块互动


您可以让功能块具有互动性,从而进一步提升功能块的使用体验。向功能块中的布局元素添加 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

如需按类名称加载导出的 activity,同时加载 intent extra,请使用 LaunchAction。

注意:请注意 LaunchAction 对应用导航的影响。Compose for Wear OS 建议您在应用中使用单个 activity。

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
    }
}

目前没有任何推荐文档页面。

请尝试登录您的 Google 账号。

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2023-11-22。

猜你喜欢

转载自blog.csdn.net/hnjzfwy/article/details/134914625
今日推荐