タイトル: メッセージの表示
SEOタイトル: Android アプリでメッセージを表示する方法(Toast / Snackbar / AlertDialog / 通知の使い分け)
| この記事の要点 |
|
Android アプリにおけるメッセージ表示の選択肢
Android アプリでユーザーへメッセージを伝える方法は複数あり、それぞれ目的・緊急度・ユーザー操作の有無で使い分けます。安易に Toast ばかり使うのではなく、適切な UI コンポーネントを選びましょう。
主要な手段の比較
| 手段 | 表示位置 | 操作 | 用途 |
|---|---|---|---|
| Toast | 画面下中央 | 不可 | 軽い補足通知 (保存完了など) |
| Snackbar | 画面下端 | アクション 1 個まで | 取り消し可能な操作通知 |
| AlertDialog | 画面中央 (モーダル) | ボタン応答必須 | 確認 / 警告 / 入力 |
| Notification | ステータスバー / 通知センター | タップで遷移 | バックグラウンド/常駐通知 |
| TextView 等の表示 | レイアウト内 | - | 常時表示するメッセージ |
1. Toast — 短時間の補足通知
画面下に数秒だけ表示される非モーダルのメッセージ。操作はできず、自動で消えます。「保存しました」「メール送信完了」のような軽い情報向き。
// Kotlin
Toast.makeText(context, "保存しました", Toast.LENGTH_SHORT).show()
// 長め表示
Toast.makeText(context, "ネットワーク接続を確認してください", Toast.LENGTH_LONG).show()// Java
Toast.makeText(this, "保存しました", Toast.LENGTH_SHORT).show();
| 定数 | 長さ |
|---|---|
Toast.LENGTH_SHORT | 約 2 秒 |
Toast.LENGTH_LONG | 約 3.5 秒 |
注意: Android 11 以降、サードパーティアプリは Toast のカスタムビューが非推奨。テキストのみが推奨されます。
2. Snackbar — アクション付き通知
Material Design 推奨。画面下端から表示され、「元に戻す」など 1 つのアクションボタンを付けられます。Toast の上位互換と考えてよい。
// Kotlin (Material Components 必要)
import com.google.android.material.snackbar.Snackbar
Snackbar.make(rootView, "アイテムを削除しました", Snackbar.LENGTH_LONG)
.setAction("元に戻す") {
// 削除を取り消す処理
viewModel.undoDelete()
}
.show()
| 定数 | 長さ |
|---|---|
Snackbar.LENGTH_SHORT | 短時間 |
Snackbar.LENGTH_LONG | 長め |
Snackbar.LENGTH_INDEFINITE | 明示的に dismiss するまで表示 |
3. AlertDialog — モーダル確認
ユーザーの応答を必須とする確認ダイアログ。削除確認や規約同意など、操作を中断させる場面で使います。
// Kotlin (AndroidX AppCompat)
AlertDialog.Builder(this)
.setTitle("削除確認")
.setMessage("このアイテムを完全に削除しますか?\n この操作は元に戻せません。")
.setPositiveButton("削除") { dialog, _ ->
viewModel.delete()
dialog.dismiss()
}
.setNegativeButton("キャンセル") { dialog, _ ->
dialog.dismiss()
}
.setNeutralButton("後で") { dialog, _ ->
dialog.dismiss()
}
.show()
4. Notification — アプリ外でも届く通知
ステータスバー / 通知センターに表示される通知。アプリがバックグラウンドでもユーザーに気づいてもらえます。チャットの新着メッセージ、ダウンロード完了などの非同期通知向き。
// Kotlin
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
// チャンネルを事前作成 (Android 8.0 以上で必須)
val channel = NotificationChannel(
"default",
"通常通知",
NotificationManager.IMPORTANCE_DEFAULT
)
notificationManager.createNotificationChannel(channel)
// 通知を作成
val notification = NotificationCompat.Builder(this, "default")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("新着メッセージ")
.setContentText("田中さんからのメッセージ")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.build()
NotificationManagerCompat.from(this).notify(1, notification)
注意: Android 13 以降は POST_NOTIFICATIONS 権限のランタイム許可が必要。
5. TextView などレイアウト内の常時表示
エラーメッセージや状態表示などはレイアウトの一部として常時表示するのが UX として良いことが多い。Snackbar / Toast に頼りすぎない設計を。
<TextView
android:id="@+id/error_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/error"
android:visibility="gone" />// 表示制御
errorMessage.text = "ネットワーク接続を確認してください"
errorMessage.isVisible = true
使い分け早見表
| シーン | 推奨 |
|---|---|
| 保存完了 | Toast / Snackbar |
| 削除直後 (取り消し可) | Snackbar |
| 削除前の確認 | AlertDialog |
| 入力エラー | TextInputLayout の error / TextView |
| 新着通知 (バックグラウンド) | Notification |
| 権限要求 | システムダイアログ + 説明文 |
FAQ
Q: Toast と Snackbar はどっちを使えばいい?
A: Material Design 準拠なら原則 Snackbar。アクションが不要で本当に軽い通知だけなら Toast でも可。
Q: AlertDialog がメモリリークする
A: Activity の Context を保持するため、向き変更で再生成された Activity を参照したまま残ると漏れる。Lifecycle 連携や onDismiss で参照を解放。
Q: Jetpack Compose ではどう?
A: SnackbarHost + SnackbarHostState、AlertDialog コンポーザブル。Toast は Compose ネイティブにはないため android.widget.Toast を呼ぶ。