É possível usar um Snackbar
para exibir uma breve mensagem para o usuário. A mensagem desaparece automaticamente após um curto período. O Snackbar
é ideal para mensagens breves que o usuário não precisa necessariamente responder. Por exemplo, um app de e-mails pode usar um Snackbar
para informar ao usuário que o app enviou um e-mail.
Usar um CoordinatorLayout
Um Snackbar
é anexado a uma visualização. O Snackbar
oferece funções básicas se é anexado a algum objeto derivado da classe View
, como qualquer um dos objetos de layout comuns. No entanto, se o Snackbar
for anexado a um CoordinatorLayout
, o Snackbar
ganhará outros recursos:
- O usuário pode dispensar o
Snackbar
deslizando-o para fora. - O layout move alguns outros elementos da IU quando o
Snackbar
é exibido. Por exemplo, se o layout tiver umFloatingActionButton
, o layout moverá o botão para cima quando ele mostrar umSnackbar
, em vez de desenhar oSnackbar
sobre o botão. Veja como isso é exibido na Figura 1.
A classe CoordinatorLayout
oferece um superconjunto da função de FrameLayout
. Se o app já usa um FrameLayout
, basta substituir esse layout por um CoordinatorLayout
para ativar a função Snackbar
completa.
Se o app usa outros objetos de layout, a coisa mais simples a fazer é unir os elementos de layout existentes em um CoordinatorLayout
, como neste exemplo:
<android.support.design.widget.CoordinatorLayout android:id="@+id/myCoordinatorLayout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" 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> </android.support.design.widget.CoordinatorLayout>
Defina uma tag android:id
para seu CoordinatorLayout
. Você precisa do ID do layout ao exibir 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, você cria um objeto Snackbar
com o texto da mensagem. Depois, você chama o método show()
do objeto para exibir a mensagem para o usuário.
Criar um objeto Snackbar
Crie um objeto Snackbar
chamando o método estático Snackbar.make()
. Durante a criação do Snackbar
, você especifica a mensagem exibida e a quantidade de tempo pela qual ela será exibida:
Kotlin
val mySnackbar = Snackbar.make(view, stringId, duration)
Java
Snackbar mySnackbar = Snackbar.make(view, stringId, duration);
- view
-
A visualização à qual o
Snackbar
será anexado. Na verdade, o método pesquisa a hierarquia de visualizações desde a view transmitida até chegar a umCoordinatorLayout
ou à visualização de conteúdo da decoração da janela. Normalmente, é mais simples transmitir apenas oCoordinatorLayout
que envolve seu conteúdo. - stringId
- O ID do recurso da mensagem que você quer exibir. Pode ser um texto formatado ou não formatado.
- duration
-
O período de exibição da mensagem. Pode ser
LENGTH_SHORT
ouLENGTH_LONG
.
Exibir a mensagem ao usuário
Depois de criar o Snackbar
, chame o método show()
dele para exibir o Snackbar
ao usuário:
Kotlin
mySnackbar.show()
Java
mySnackbar.show();
O sistema não mostra vários objetos Snackbar
ao mesmo tempo. Assim, se a visualização estiver exibindo outro Snackbar
, o sistema colocará seu Snackbar
na fila e o exibirá após o Snackbar
atual expirar ou ser dispensado.
Se você quiser apenas exibir uma mensagem para o usuário e não precisar chamar nenhum método utilitário do objeto Snackbar
, não será necessário manter a referência ao Snackbar
depois de chamar show()
. Por isso, é comum usar o encadeamento de métodos para criar e mostrar um Snackbar
em uma declaração:
Kotlin
Snackbar.make( findViewById(R.id.myCoordinatorLayout), R.string.email_sent, Snackbar.LENGTH_SHORT ).show()
Java
Snackbar.make(findViewById(R.id.myCoordinatorLayout), R.string.email_sent, Snackbar.LENGTH_SHORT) .show();