Criar e exibir uma mensagem pop-up

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 usar um Snackbar para mostrar uma breve mensagem ao usuário. Ao contrário das notificações, a mensagem desaparece automaticamente após um curto período. Um Snackbar é ideal para mensagens breves que não exigem ação do usuário. Por exemplo, um app de e-mail pode usar um Snackbar para informar ao usuário que o app enviou um e-mail com sucesso.

Usar um CoordinatorLayout

Um Snackbar é anexado a uma visualização. O Snackbar fornece funcionalidade básica se estiver anexado a qualquer objeto derivado da classe View, como qualquer um dos objetos de layout comuns. No entanto, se o Snackbar estiver anexado a um CoordinatorLayout, ele terá mais recursos:Snackbar

  • O usuário pode dispensar o Snackbar deslizando para o lado.
  • O layout move outros elementos da interface quando o Snackbar aparece. Por exemplo, se o layout tiver um FloatingActionButton, ele vai mover o botão para cima quando mostrar um Snackbar, em vez de desenhar o Snackbar em cima do botão. Confira como isso aparece na Figura 1.

A classe CoordinatorLayout oferece um superconjunto da funcionalidade de FrameLayout. Se o app já usa um FrameLayout, substitua esse layout por um CoordinatorLayout para ativar toda a funcionalidade do Snackbar. Se o app usar outros objetos de layout, agrupe os elementos de layout em um CoordinatorLayout, conforme mostrado no exemplo a seguir:

<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/myCoordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Here are the existing layout elements, now wrapped in
         a CoordinatorLayout. -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!-- ...Toolbar, other layouts, other elements... -->

    </LinearLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Defina uma tag android:id para seu CoordinatorLayout. Você precisa do ID do layout ao mostrar a mensagem.

Figura 1. O CoordinatorLayout move o FloatingActionButton para cima quando o Snackbar aparece.

Exibir uma mensagem

Há duas etapas para exibir uma mensagem. Primeiro, crie um objeto Snackbar com o texto da mensagem. Em seguida, chame o método show() desse objeto para mostrar a mensagem ao usuário.

Criar um objeto Snackbar

Crie um objeto Snackbar chamando o método estático Snackbar.make(). Ao criar o Snackbar, especifique a mensagem que ele mostra e o tempo de exibição:

val mySnackbar = Snackbar.make(view, stringId, duration)
visualizar
A visualização a que o Snackbar será anexado. O método pesquisa a hierarquia de visualização da visualização transmitida até alcançar um CoordinatorLayout ou a visualização de conteúdo da decoração da janela. Normalmente, é mais simples transmitir o CoordinatorLayout que envolve seu conteúdo.
stringId
O ID do recurso da mensagem que você quer mostrar. Ele pode ser formatado ou não formatado.
duração
O período em que a mensagem é mostrada. Pode ser LENGTH_SHORT ou LENGTH_LONG.

Mostrar a mensagem ao usuário

Depois de criar o Snackbar, chame o método show() para mostrar o Snackbar ao usuário:

mySnackbar.show()

O sistema não mostra vários objetos Snackbar ao mesmo tempo. Portanto, se a visualização estiver mostrando outro Snackbar, o sistema vai enfileirar seu Snackbar e mostrá-lo depois que o Snackbar atual expirar ou for dispensado.

Se você quiser mostrar uma mensagem ao usuário e não precisar chamar nenhum dos métodos utilitários do objeto Snackbar, não será necessário manter a referência ao Snackbar depois de chamar show(). Por esse motivo, é comum usar o encadeamento de métodos para criar e mostrar um Snackbar em uma instrução:

Snackbar.make(
    findViewById(R.id.myCoordinatorLayout),
    R.string.email_sent,
    Snackbar.LENGTH_SHORT
).show()