Toast 消息
2026/1/31大约 2 分钟
Toast 消息
本笔记说明 Android 原生 Toast 的常用 API、在 Jetpack Compose 中的使用方式、与 Snackbar 的对比、以及若干最佳实践与示例代码。
核心 API(Android 原生)
Toast.makeText(context: Context, text: CharSequence, duration: Int): Toast:创建一个 Toast 实例。Toast.LENGTH_SHORT、Toast.LENGTH_LONG:时长常量。toast.show():显示 Toast。Toast.setView(view: View):替换 Toast 的 View,实现自定义布局(在 Android 12+ 上有更多限制)。
示例:
Toast.makeText(context, "操作完成", Toast.LENGTH_SHORT).show()在 Jetpack Compose 中使用
Compose 本身不提供专门的 Toast API,通常直接调用平台 API:
@Composable
fun ToastButtonSample() {
val context = LocalContext.current
Button(onClick = {
Toast.makeText(context, "已点击", Toast.LENGTH_SHORT).show()
}) {
Text("显示 Toast")
}
}响应状态变化显示 Toast(用副作用):
@Composable
fun ShowToastWhenMessage(message: String?) {
val context = LocalContext.current
LaunchedEffect(message) {
if (!message.isNullOrEmpty()) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}
}通过 ViewModel 事件流分发(推荐用于 MVVM 场景):
// ViewModel: val events = MutableSharedFlow<String>()
// viewModel.events.tryEmit("已保存")
@Composable
fun ObserveToastEvents(viewModel: MyViewModel = androidx.lifecycle.viewmodel.compose.viewModel()) {
val context = LocalContext.current
LaunchedEffect(Unit) {
viewModel.events.collectLatest { msg ->
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
}
}
}自定义 Toast
可以用自定义布局,但在新系统上存在限制且不推荐用于常规提示:
val toast = Toast(context.applicationContext)
val view = LayoutInflater.from(context).inflate(R.layout.custom_toast, null)
toast.view = view
toast.duration = Toast.LENGTH_LONG
toast.show()与 Snackbar 的对比
- Toast:系统浮层、不可交互、短时提示(跨 Activity 可见)。
- Snackbar:应用内、可交互(带动作),更易与 Compose/Material 覆盖配合,推荐用于大多数应用内提示。
建议:优先使用 SnackbarHostState.showSnackbar(...) 作为应用内提示;仅在需要系统级短暂提示时使用 Toast。
最佳实践
- 在主线程或 Compose 副作用中显示 Toast,避免在后台线程直接调用。
- 跨 Activity 使用时可用
applicationContext避免生命周期问题。 - 避免短时间内连续弹出多个 Toast,影响体验。
- 对于需要用户交互或撤销的提示,使用 Snackbar。
速查
- 显示:
Toast.makeText(context, "text", Toast.LENGTH_SHORT).show() - 时长:
Toast.LENGTH_SHORT/Toast.LENGTH_LONG - Compose 获取 Context:
val context = LocalContext.current
如需,我可以把示例拆成带 @Preview 的 Kotlin 文件并加入样例模块,或为你实现基于 SharedFlow 的消息分发范例。
代码
@Composable
fun ToastComponents() {
/*
* 创建一个Toast
* */
// 当前上下文 只能在Composable使用
var ctx = LocalContext.current
var toast = Toast.makeText(
ctx,
"this is toast message.",
Toast.LENGTH_SHORT
)
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = androidx.compose.ui.Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Button(onClick = {
toast.show()
}) {
Text(text = "Toast")
}
}
}