Obsługa interakcji użytkownika

Funkcja W skrócie upraszcza obsługę interakcji z użytkownikiem za pomocą klas Action. W skrócie Klasy Action określają czynności, które może wykonać użytkownik. Możesz określić operacji wykonywanej w odpowiedzi na dane działanie. Możesz zastosować Action do dowolnej za pomocą metody GlanceModifier.clickable.

Widżety aplikacji działają w procesie zdalnym, więc działania są zdefiniowane podczas ich tworzenia czas, a jego wykonanie ma miejsce w procesie zdalnym. W natywnej wersji językowej RemoteViews: Odbywa się to za pomocą usługi PendingIntents.

Na tej stronie opisujemy następujące działania:

.

Uruchamianie aktywności

Aby uruchomić aktywność na podstawie interakcji użytkownika, podaj w parametrze actionStartActivity do funkcji Button lub innej funkcji kompozycyjnej za pomocą GlanceModifier.clickable(..).

Podaj jeden z tych elementów w actionStartActivity:

W skrócie przekształca działanie na PendingIntent z podanym celem i . W poniższym przykładzie aplikacja NavigationActivity jest uruchamiana, gdy użytkownik klika przycisk:

@Composable
fun MyContent() {
    // ..
    Button(
        text = "Go Home",
        onClick = actionStartActivity<MyActivity>()
    )
}

Uruchamianie usługi

Podobnie jak przy uruchamianiu działania, uruchomienie usługi przy interakcji użytkownika za pomocą jednej z metod actionStartService.

Podaj jeden z tych elementów w actionStartService:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Sync",
        onClick = actionStartService<SyncService>(
            isForegroundService = true // define how the service is launched
        )
    )
}

Wyślij transmitowane wydarzenie

Wyślij zdarzenie transmisji dotyczące interakcji użytkownika za pomocą jednej z Metody actionSendBroadcast:

Podaj jeden z tych elementów w actionSendBroadcast:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Send",
        onClick = actionSendBroadcast<MyReceiver>()
    )
}

Wykonywanie działań niestandardowych

Zamiast wyznaczać konkretny cel, W skrócie może użyć działania lambda lub actionRunCallback, aby wykonać działanie, na przykład zaktualizować interfejs lub stan interakcji użytkownika.

Uruchamianie działań lambda

Funkcji lambda możesz używać jako wywołań zwrotnych do interakcji w interfejsie.

Na przykład przekaż funkcję lambda do funkcji GlanceModifier.clickable modyfikator:

Text(
    text = "Submit",
    modifier = GlanceModifier.clickable {
        submitData()
    }
)

Możesz też przekazać go do parametru onClick w elementach kompozycyjnych, które go obsługują:

Button(
    text = "Submit",
    onClick = {
        submitData()
    }
)

Uruchamianie wywołania zwrotnego

Możesz też użyć metod actionRunCallback, aby wykonać działanie na interakcji użytkownika. Aby to zrobić, udostępnij niestandardową implementację interfejsu ActionCallback:

@Composable
private fun MyContent() {
    // ..
    Image(
        provider = ImageProvider(R.drawable.ic_hourglass_animated),
        modifier = GlanceModifier.clickable(
            onClick = actionRunCallback<RefreshAction>()
        ),
        contentDescription = "Refresh"
    )
}

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        // TODO implement
    }
}

Po kliknięciu przez użytkownika metoda suspend onAction podanej Pole ActionCallback jest wywoływane, wykonując zdefiniowaną logikę (czyli żądanie odśwież dane).

Aby zaktualizować widżet po wykonaniu działania, utwórz nową instancję wywołaj update(..). Więcej informacji znajdziesz w artykule Zarządzanie stanem widżetu GlanceAppWidget .

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        // do some work but offset long-term tasks (e.g a Worker)
        MyAppWidget().update(context, glanceId)
    }
}

Podaj parametry działań

Aby podać dodatkowe informacje o działaniu, skorzystaj z tagu ActionParameters API do tworzenia par klucz-wartość o określonym typie. Aby na przykład zdefiniować kliknięte miejsce docelowe:

private val destinationKey = ActionParameters.Key<String>(
    NavigationActivity.KEY_DESTINATION
)

class MyAppWidget : GlanceAppWidget() {

    // ..

    @Composable
    private fun MyContent() {
        // ..
        Button(
            text = "Home",
            onClick = actionStartActivity<NavigationActivity>(
                actionParametersOf(destinationKey to "home")
            )
        )
        Button(
            text = "Work",
            onClick = actionStartActivity<NavigationActivity>(
                actionParametersOf(destinationKey to "work")
            )
        )
    }

    override suspend fun provideGlance(context: Context, id: GlanceId) {
        provideContent { MyContent() }
    }
}

Na dole znajdują się parametry, które są uwzględnione w intencji użytej do uruchomienia funkcji aktywność, co umożliwia docelowej aktywności pobrać ją.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val destination = intent.extras?.getString(KEY_DESTINATION) ?: return
        // ...
    }
}

Te parametry są też przekazywane do interfejsu ActionCallback. Użyj zdefiniowanego Parameters.Key, aby pobrać wartość:

class RefreshAction : ActionCallback {

    private val destinationKey = ActionParameters.Key<String>(
        NavigationActivity.KEY_DESTINATION
    )

    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        val destination: String = parameters[destinationKey] ?: return
        // ...
    }
}