Adicionar uma ação a uma mensagem

Experimente trabalhar com o Compose
O Jetpack Compose é o kit de ferramentas de UI recomendado para Android. Aprenda a adicionar notificações no Compose.

Você pode adicionar uma ação a um Snackbar para permitir que o usuário responda à sua mensagem. Quando você faz isso, o Snackbar coloca um botão ao lado do texto da mensagem, e o usuário pode acionar sua ação tocando no botão. Por exemplo, um app de e-mails pode colocar um botão desfazer na mensagem "e-mail arquivado". Se o usuário tocar no botão desfazer, o app vai remover o e-mail do arquivo.

Imagem mostrando uma snackbar com um botão de ação DESFAZER
Figura 1. Um Snackbar com um botão de ação de desfazer que restaura um item removido.

Para adicionar uma ação a uma mensagem do Snackbar, defina um objeto listener que implemente a interface View.OnClickListener. O sistema chama o método onClick() do listener se o usuário tocar na ação da mensagem. Por exemplo, este snippet mostra um listener para uma ação de desfazer:

Kotlin

class MyUndoListener : View.OnClickListener {

  fun onClick(v: View) {
    // Code to undo the user's last action.
  }
}

Java

public class MyUndoListener implements View.OnClickListener {

    @Override
    public void onClick(View v) {

        // Code to undo the user's last action.
    }
}

Use um dos métodos setAction() para anexar o listener ao seu Snackbar. Anexe o listener antes de chamar show(), como mostrado neste exemplo de código:

Kotlin

val mySnackbar = Snackbar.make(findViewById(R.id.myCoordinatorLayout),
                               R.string.email_archived, Snackbar.LENGTH_SHORT)
mySnackbar.setAction(R.string.undo_string, MyUndoListener())
mySnackbar.show()

Java

Snackbar mySnackbar = Snackbar.make(findViewById(R.id.myCoordinatorLayout),
        R.string.email_archived, Snackbar.LENGTH_SHORT);
mySnackbar.setAction(R.string.undo_string, new MyUndoListener());
mySnackbar.show();
Se você estiver usando o Jetpack Compose, poderá mostrar um SnackbarHost, como mostrado no exemplo a seguir:

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {

      super.onCreate(savedInstanceState)

      setContent {
          DACPlaygroundTheme {
              val snackbarHostState = remember { SnackbarHostState() }
              val scope = rememberCoroutineScope()
              Scaffold(
                  snackbarHost = { SnackbarHost(snackbarHostState) },
                  content = { padding ->
                      Button(
                          modifier = Modifier.padding(padding),
                          onClick = {
                              scope.launch {
                                  snackbarHostState.showSnackbar(
                                      message = "1 item removed",
                                      actionLabel = "UNDO",
                                      duration = SnackbarDuration.Short
                                  ).run {
                                      when (this) {
                                          Dismissed -> Log.d("SNACKBAR", "Dismissed")
                                          ActionPerformed -> Log.d("SNACKBAR", "UNDO CLICKED")
                                      }
                                  }
                              }
                          }
                      ) { Text("Show snackbar") }
                  }
              )
          }
      }
  }