Android中调用setGravity设置Toast居中显示不生效问题咨询
问题根源
你写的代码调用逻辑在Android 11(API 30)及以下原生系统上是完全正确的,setGravity不生效不是代码顺序写错导致的,核心原因来自系统或定制ROM的强制限制:
- Android 12(API 31)的行为变更限制:从该版本开始,系统对没有绑定自定义View的纯文本Toast(也就是通过
Toast.makeText()创建的默认Toast)做了位置锁定,应用传入的所有setGravity()参数、水平/垂直偏移量都会被系统直接忽略,这类Toast会被固定显示在系统规定的默认位置(屏幕底部距导航栏固定间距的位置),无论怎么调整参数都无法改变显示位置。 - 国产定制ROM的全局拦截:部分国内厂商的定制系统会全局拦截应用发出的所有Toast,强制将Toast拉到系统默认位置,哪怕是低版本Android系统也可能出现这个问题,和应用内的代码逻辑无关。
可落地的解决方案
- 适配Android 12及以上版本:放弃无自定义View的纯文本Toast,给Toast绑定自定义布局,这类带View的Toast不受Android12的位置限制,setGravity参数可以正常生效,参考改造后的核心逻辑:
// 替换原有btn_toast_2的点击逻辑 Toast centerToast = new Toast(ToastViewActivity.this); // 加载自定义Toast布局 View toastLayout = LayoutInflater.from(ToastViewActivity.this) .inflate(R.layout.layout_custom_toast, null); // 给布局内的文本控件赋值 ((TextView) toastLayout.findViewById(R.id.tv_toast_text)).setText("CENTER"); // 必须设置自定义View,否则位置参数会被系统拦截 centerToast.setView(toastLayout); centerToast.setDuration(Toast.LENGTH_LONG); // 此时设置居中位置可以正常生效 centerToast.setGravity(Gravity.CENTER, 0, 0); centerToast.show(); - 低版本兼容说明:你原有代码的调用顺序(makeText -> setGravity -> show)在API 30及以下的原生系统上运行是可以正常让Toast居中显示的,不需要额外调整代码顺序。
- 针对ROM拦截场景:如果绑定了自定义View的Toast还是被拉到默认位置,说明ROM的Toast拦截不区分是否带自定义View,这种场景下直接放弃使用系统Toast,通过WindowManager添加自定义悬浮View实现提示效果即可,不受Toast的系统限制。
内容的提问来源于stack exchange,提问作者WoodPecker
相关产品推荐
相关产品推荐

