Mit Kacheln interagieren

Du kannst deine Ansichten zusätzlich interaktiv gestalten. Wenn Sie einem Layoutelement innerhalb der Kachel den Modifikator Clickable hinzufügen, können Sie darauf reagieren, wenn ein Nutzer auf dieses Layoutelement tippt.

Auf dieser Seite sind einige häufige Aktionen aufgelistet, die Nutzer in interaktiven Kacheln ausführen, sowie eine Anleitung zur Implementierung dieses Verhaltens in den Kacheln deiner App.

Neues Kachellayout laden

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

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

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 Status 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 Inhalts der Kachel 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 Methode onTileRequest() 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

Wenn Sie eine exportierte Aktivität nach Klassennamen und mit Intent-Extras laden möchten, verwenden Sie eine 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()

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