Tương tác với thẻ thông tin

Bạn có thể cải thiện hơn nữa trải nghiệm với thẻ thông tin bằng cách tạo ra khả năng tương tác cho thẻ thông tin. Bằng cách thêm đối tượng sửa đổi Clickable vào một phần tử bố cục trong thẻ thông tin, bạn có thể tương tác với người dùng nhấn vào phần tử bố cục đó.

Trang này liệt kê một số thao tác thường dùng mà người dùng thực hiện trong các thẻ thông tin tương tác, cùng với hướng dẫn về cách triển khai hành vi này trong các thẻ thông tin của ứng dụng.

Tải một bố cục mới cho thẻ thông tin

Sử dụng LoadAction để làm mới bố cục của thẻ thông tin khi người dùng nhấn vào một phần tử tương tác.

Trong đoạn mã sau, mã nhận dạng có thể nhấp được đặt trong setId() được chuyển cùng với lệnh gọi onTileRequest(), nên bạn có thể hiển thị một bố cục khác theo mã nhận dạng này:

override fun onTileRequest(requestParams: TileRequest) = Futures.immediateFuture(
    Tile.Builder()
        .setResourcesVersion("1")
        .setTileTimeline(Timeline.fromLayoutElement(
            when(requestParams.currentState.lastClickableId) {
                "foo" -> myFooLayout()
                else -> myOtherLayout()
            }
        )).build()
)

Cập nhật trạng thái trong thẻ thông tin

Nếu một phần tử tương tác trong thẻ thông tin của bạn có nhiều trạng thái, hãy sử dụng LoadAction để hiển thị giá trị mới của phần tử đó. Trong đoạn mã sau đây, thẻ thông tin cho thấy giá trị đã cập nhật của một hộp đánh dấu:

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()

Yêu cầu làm mới nội dung của thẻ thông tin

Để yêu cầu cập nhật toàn bộ nội dung của thẻ thông tin, hãy sử dụng LoadAction và cập nhật trạng thái yêu cầu của thẻ thông tin như trong đoạn mã sau.

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()

Để tải một hoạt động bằng một đường liên kết sâu, hãy liên kết một phần tử có thể nhấp với đối tượng 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()

Sau đó, trong phương thức onTileRequest(), hãy dùng đối tượng TaskStackBuilder làm đối tượng trợ giúp:

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

Tải một hoạt động đã xuất

Để tải một hoạt động đã xuất theo tên lớp và bằng ý định bổ sung, hãy sử dụng 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()

Bên trong hoạt động đã khởi chạy, bạn có thể truy xuất mã nhận dạng dùng cho thẻ thông tin, như trong ví dụ sau:

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