YuanKJ-
YuanKJ-
+1,我这边也出现这个问题,目前看来是只能把源码拉下来去掉dialog?这么鸡肋的dialog,以作者的知名度应该不会写出来才对吧
看了7.1的源码,Toast内部TN类的show方法已经去掉了,取而代之的是show(IBinder windowToken)。 新的逻辑在Toast显示的时候往windowManager加入了windowToken,有空再尝试修复。 有兴趣的同学可以到以下2个地址看源代码: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/Toast.java https://github.com/android/platform_frameworks_base/blob/master/services/core/java/com/android/server/notification/NotificationManagerService.java
Android N以上已经不可用了,无法修复 具体原因以及寻找修复方法的流程: 1. Toast的show方法,增加了一个IBinder的token参数,show方法可以不经过NotificationManager直接显示Toast,所以这个方法是关键 2. 沿着Toast的show方法往下看,发现handleShow显示Toast的时候出现一句代码 `mParams.hideTimeoutMilliseconds = mDuration == Toast.LENGTH_LONG ? LONG_DURATION_TIMEOUT : SHORT_DURATION_TIMEOUT;` 这句代码出现了一种非此即彼的方式来约定显示时间,就是说Toast通过反射的方式从中间开始走显示流程,已经无法做到一直显示Toast了。 3. 但不死心的我还是尝试了一下楼上提供出来的解决方法,判断版本,传入Activity.getToken()拿到的IBinder参数,然而发现Toast一闪即逝,很明显是Token问题导致一显示就立刻被隐藏掉了。 接下来详细看了下WindowManagerService中处理Toast显示部分的逻辑: ``` // If adding a toast requires a token for...
不好意思,这个我没有具体去尝试过,这是悬浮窗不需要权限的其中一种方法。 你说的edittext无法打开键盘的问题,或许有其他方法可以实现,因为UC浏览器的快捷搜索悬浮窗,也是可以输入的,但具体实现方式不详。 这个项目里面的文档介绍比较旧了,MIUI8已经封锁了这种自定义悬浮窗的方式。 这边有一篇最近写的文章,你可以看看,但edittext的问题可能需要你自行解决 http://blog.csdn.net/xyq046463/article/details/51840586
补充一下,UC浏览器的快捷搜索悬浮窗也是这种Toast类型的悬浮窗,不需要权限
问题补充,我升级tinker版本的原因是因为遇到打补丁包出现 found loader classes are found in old secondary dex的问题,跟issue #1205 中看到的问题一致。 项目的gradle版本和AGP版本在8月就已经升级到5.1.1, 3.4.2并且直到11月底都能够成功打补丁包。 第一次打补丁包失败是发现项目依赖了一个三方库升级到了JAVA8导致出现了上面的found loader classes are found in old secondary dex,后续尝试了把三方库降级到不需要JAVA8,再次打包仍然出现found loader classes are found in old secondary...
重要补充!!! 已定位到出现 found loader classes are found in old secondary dex 问题出现的位置。 我这边的项目使用的是组件化开发,出现问题前后修改的主要点是在 baseComponent module 中增加了kotlin的使用,在该module的build.gradle中增加了如下两句配置,并且在该module中增加了几个使用kotlin开发的类 ``` apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' ``` 实测回退到上一个没有在 baseComponent module 中配置kotlin环境的commit尝试打包正常,并且包体积也正常,只有100K左右。 @tomystang 继续@大佬
> 是的后来解决了,解决方案是离职