Mit Kacheln interagieren

Sie können Ihre Ansichten noch weiter verbessern, indem Sie sie interaktiv gestalten. Wenn Sie einem Layoutelement in der Kachel den Modifikator Clickable hinzufügen, können Sie reagieren, wenn ein Nutzer auf dieses Layoutelement tippt.

Auf dieser Seite finden Sie eine Liste gängiger Aktionen, die Nutzer innerhalb interaktiver Kacheln ausführen, sowie eine Anleitung zur Implementierung dieses Verhaltens in den Kacheln Ihrer Anwendung.

Neues Kachellayout laden

Mit LoadAction können Sie das Layout der Kachel aktualisieren, wenn der Nutzer auf ein interaktives Element tippt.

Im folgenden Code-Snippet wird die in setId() festgelegte anklickbare ID mit dem onTileRequest()-Aufruf übergeben. So können Sie ein anderes Layout basierend auf dieser ID rendern:

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

Status in der Kachel aktualisieren

Wenn ein interaktives Element in Ihrer Kachel mehrere mögliche Zustände hat, verwenden Sie LoadAction, um den neuen Wert des Elements anzuzeigen. Im folgenden Code-Snippet zeigt die Kachel den aktualisierten Wert eines Kästchens an:

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

Aktualisierung des Kachelinhalts anfordern

Wenn Sie eine Aktualisierung des gesamten Inhalts der Kachel anfordern möchten, verwenden Sie LoadAction und aktualisieren Sie den Anfragestatus der Kachel, wie im folgenden Code-Snippet gezeigt.

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

Wenn Sie eine Aktivität über einen Deeplink laden möchten, verknüpfen Sie ein anklickbares Element mit einem LoadAction-Objekt:

private fun tappableElement(): LayoutElement =
    Text.Builder()
        .setText("Tap me!")
        .setModifiers(Modifiers.Builder()
            .setClickable(Clickable.Builder()
                .setId("foo")
                .setOnClick(LoadAction.Builder().build())
                .build()
            ).build()
        ).build()

Verwenden Sie dann in der onTileRequest()-Methode ein TaskStackBuilder-Objekt als Hilfsprogramm:

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

Exportierte Aktivität laden

Verwenden Sie einen LaunchAction, um eine exportierte Aktivität nach Klassenname und mit Intent-Extras zu laden.

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

Innerhalb der gestarteten Aktivität können Sie die für die Kachel verwendete ID abrufen, wie im folgenden Beispiel gezeigt:

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