Interagire con i riquadri

Puoi migliorare ulteriormente l'esperienza dei riquadri rendendoli interattivi. Aggiungendo il modificatore Clickable a un elemento del layout all'interno del riquadro, puoi reagire quando un utente tocca l'elemento in questione.

Questa pagina elenca diverse azioni comuni eseguite dagli utenti all'interno dei riquadri interattivi, insieme alle indicazioni su come implementare questo comportamento nei riquadri della tua app.

Carica un nuovo layout dei riquadri

Utilizza LoadAction per aggiornare il layout del riquadro quando l'utente tocca un elemento interattivo.

Nello snippet di codice riportato di seguito, l'ID cliccabile impostato in setId() viene passato alla chiamata onTileRequest(), in modo che tu possa mostrare un layout diverso in base a questo ID:

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

Aggiorna lo stato all'interno del riquadro

Se un elemento interattivo nel riquadro ha diversi stati possibili, utilizza LoadAction per mostrare il nuovo valore dell'elemento. Nel seguente snippet di codice, il riquadro mostra il valore aggiornato di una casella di controllo:

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

Richiedere un aggiornamento dei contenuti del riquadro

Per richiedere un aggiornamento dell'intero contenuto del riquadro, utilizza LoadAction e aggiorna lo stato della richiesta del riquadro, come mostrato nel seguente snippet di codice.

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

Per caricare un'attività utilizzando un link diretto, associa un elemento cliccabile a un oggetto 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()

Quindi, nel metodo onTileRequest(), utilizza un oggetto TaskStackBuilder come aiuto:

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

Carica un'attività esportata

Per caricare un'attività esportata in base al nome del corso e con extra per intent, utilizza un 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()

All'interno dell'attività avviata, puoi recuperare l'ID utilizzato per il riquadro, come mostrato nell'esempio seguente:

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