liangjingkanji / Tooltip

🍞 Android 快速创建吐司/对话框 Quick crete Toast or Dialog
https://liangjingkanji.github.io/Tooltip/
MIT License
118 stars 9 forks source link

Android 12 (Api 31) 吐司居中导致出现的异常 #6

Closed berial closed 2 years ago

berial commented 2 years ago

Error1: setGravity() shouldn't be called on text toasts, the values won't be used

Toast.java 367

Error2: You must either set a text or a view

Toast.java 191

liangjingkanji commented 2 years ago

这是警告还是崩溃? Android12的确不允许继续使用setGravity, 也不允许自定义吐司

希望贴出相对完整的异常信息

berial commented 2 years ago

上面提到的Error2会导致App崩溃,下面是完整信息:

2021-12-13 13:37:53.547 E/Toast: setGravity() shouldn't be called on text toasts, the values won't be used 2021-12-13 13:37:53.550 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.tuanshang.aoye.app, PID: 4656 java.lang.IllegalStateException: You must either set a text or a view at com.android.internal.util.Preconditions.checkState(Preconditions.java:215) at android.widget.Toast.show(Toast.java:191) at com.drake.tooltip.ToastKt$showDefault$1.invoke(Toast.kt:87) at com.drake.tooltip.ToastKt$showDefault$1.invoke(Unknown Source:0) at com.drake.tooltip.ToastConfigKt.runMain(ToastConfig.kt:40) at com.drake.tooltip.ToastKt.showDefault(Toast.kt:77) at com.drake.tooltip.ToastKt.showDefault$default(Toast.kt:74) at com.drake.tooltip.ToastKt.toast(Toast.kt:15) at com.berial.libcommon.util.UtilKt.toast(util.kt:31) at com.berial.libcommon.util.UtilKt.toast(util.kt:35) at com.tuanshang.blockchain.app.ui.login.LoginFragment.login(LoginFragment.kt:91) at com.tuanshang.blockchain.app.databinding.FragmentLoginBindingImpl._internalCallbackOnClick(FragmentLoginBindingImpl.java:757) at com.tuanshang.blockchain.app.generated.callback.OnClickListener.onClick(OnClickListener.java:11) at com.tuanshang.blockchain.app.ext.ViewBindingAdapter.setOnClick$lambda-0(ViewBindingAdapter.kt:35) at com.tuanshang.blockchain.app.ext.ViewBindingAdapter.$r8$lambda$vEZKxvEoYwEW0KUNZ5xoHT3n4es(Unknown Source:0) at com.tuanshang.blockchain.app.ext.ViewBindingAdapter$$ExternalSyntheticLambda0.onClick(Unknown Source:6) at android.view.View.performClick(View.java:7441) at android.view.View.performClickInternal(View.java:7418) at android.view.View.access$3700(View.java:835) at android.view.View$PerformClick.run(View.java:28676) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

liangjingkanji commented 2 years ago

你有自定义某些操作吗?还是说demo复现的

berial commented 2 years ago

就这个,没别的了: ToastConfig.apply { onToast { , -> setGravity(Gravity.CENTER, 0, 0) } }

liangjingkanji commented 2 years ago

错误提示说了12不准用这个自定义吐司了

berial commented 2 years ago

不考虑兼容一下12吗

liangjingkanji commented 2 years ago

这是系统限制,无法兼容。 不过崩溃考虑解决下

berial commented 2 years ago

我看他这个可以,我用了正常显示了: https://github.com/getActivity/ToastUtils

liangjingkanji commented 2 years ago

我看他这个可以,我用了正常显示了: https://github.com/getActivity/ToastUtils

居中有效吗?

berial commented 2 years ago

有效果 居中提示

liangjingkanji commented 2 years ago

等我研究尝试兼容下(不排除不去适配, 因为得考虑未来继续兼容), 现在临时解决下不设置居中(符合官方要求). 或者直接自定义一个toast()函数里面使用ToastUtils. 修改导包即可全局替换

liangjingkanji commented 2 years ago

我在Android12的模拟器上无法复现, 并且我将项目目标sdk调整成31依然不会崩溃. 自定义和调整Gravity都没问题. 你能在模拟器上复现吗?

berial commented 2 years ago

可以复现,代码我放到: https://github.com/Berial/TestToast 模拟器是Pixel 2 API 31, 1080x1920:420dpi, x86_64

liangjingkanji commented 2 years ago

问题原因是

  1. 文字吐司设置Gravity无效
  2. 自定义吐司下Gravity有效, 但是不允许后台显示

你像Demo一样设置一个自定义视图即可解决崩溃问题同时设置居中. ToastUtils是全部自定义吐司和在后台自动使用文字吐司. 另外我会开始兼容和重构吐司, 依旧使用官方公开Api保证兼容问题.

liangjingkanji commented 2 years ago

最新版本中改为ToastFactory来构建吐司, 并且提供ToastGravityFactory默认居中的吐司样式

owant commented 2 years ago

怎么关闭了

liangjingkanji commented 2 years ago

最新版本中改为ToastFactory来构建吐司, 并且提供ToastGravityFactory默认居中的吐司样式

因为解决了, 其实这本也不属于本项目的bug, 不过提供了默认实现ToastGravityFactory

为避免有相同在Android12没有适配出现问题的开发者, 本问题置顶