如何设置Toast样式及让Tab显示在Toast上方?
嘿,这个问题我太熟悉啦!现在你的Toast盖在Tab上面,想要反过来让Tab压在Toast上方,核心就是调整Toast的窗口层级,让它的优先级低于Tab所在的界面窗口就行,给你两个实用的方案:
方案一:自定义Toast修改窗口层级
Android系统默认的Toast用的是TYPE_TOAST层级,这个层级本来就设计成在APP界面之上,所以我们把它改成和APP子窗口同级的层级,就能让Tab盖在它上面了。直接上代码:
// 先创建普通Toast val myToast = Toast.makeText(this, "这是调整后的Toast", Toast.LENGTH_SHORT) // 获取Toast的根视图 val toastView = myToast.view // 获取窗口布局参数并修改层级 val windowParams = toastView.layoutParams as WindowManager.LayoutParams // 改成APP子窗口层级,优先级低于APP主窗口 windowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL // 加上必要的标志,避免影响APP交互 windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE // 把修改后的参数设回去 toastView.layoutParams = windowParams // 显示Toast myToast.show()
注意:如果是Android 11及以上版本,要是遇到Toast显示异常的情况,可以在Manifest里加上<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>,并在运行时申请这个权限(针对Android 6.0+的设备)。
方案二:用自定义弹窗替代Toast
要是觉得修改Toast层级太麻烦,完全可以自己做个仿Toast的弹窗,这样能完全控制它的显示层级和位置。比如用Dialog来实现:
// 创建自定义Dialog val customToastDialog = Dialog(this) // 设置自定义布局(可以自己写个和Toast一样的布局) customToastDialog.setContentView(R.layout.custom_toast_layout) // 设置弹窗背景透明,模拟Toast的样式 customToastDialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) // 设置弹窗大小自适应内容 customToastDialog.window?.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) // 调整弹窗位置到Tab下方(这样Tab自然就在它上面了) customToastDialog.window?.attributes?.apply { gravity = Gravity.BOTTOM y = 150 // 这个值可以根据你Tab的高度调整,让Toast刚好在Tab下面 } // 显示弹窗 customToastDialog.show() // 别忘了设置自动消失,模拟Toast的时长 Handler(Looper.getMainLooper()).postDelayed({ customToastDialog.dismiss() }, 2000) // 2秒后消失,和Toast.LENGTH_SHORT一致
这个方案的好处是灵活度更高,你还可以自定义Toast的样式,完全适配自己的APP风格~
内容的提问来源于stack exchange,提问作者wstudiokiwi
相关产品推荐
相关产品推荐

