记一次问题分析错误
背景:fragment 中 show 了一个传统 dialog,传统dialog 的点击事件中又准备 show 一个DialogFragment 类型的 dialog,但是一直 show 不出来。
解决办法:注释代码,观察日志,未发现明显错误或警告。
最终原因:click 事件中存在耗时操作阻塞了 dialog 的显示,将耗时操作放入异步即可。
PS:又是一次简单原因导致的【长耗时】问题。
约束布局 Group 无法显示/隐藏的问题
以前听人说过,没注意,这次遇到了,reference_id 被混淆导致。不过也是第一次用这个玩意儿,解决办法就是要么代码里去设置 referenceid,要么配置白名单:
https://github.com/shwenzhang/AndResGuard
https://github.com/shwenzhang/AndResGuard/issues/264
参考:
https://juejin.im/post/6844903625622306823
Win10 Java环境
这年头 Oracle 的 jdk 不好找啊,公司电脑之前别人装的环境乱七八糟,自己重新装了下,才知道世道已经变了。下载都好费劲啊,一个普通开发,真用不着那么的废力呢,俺们是写 kotlin 的呢。各旧版 jdk 下载地址:
https://github.com/frekele/oracle-java/releases
以前有个 java 的一键配置工具(备份,防止以后需要,管理员运行,选择路径即可):
Kotlin 读写 txt 文件
总所周知,Kotlin 是一种非常优秀的现代语言,其优秀主要体现在 kotlin 拥有类似 py 一样便捷的各种扩展函数,对于 File 本身来说,就有writeText
readLines
useLines
readText
等,但这里还是使用原始方式写一下:
fun File.save(content: String) {
val fw = FileWriter(this)
fw.use {
it.write(content)
}
}
fun File.load(): String {
val builder = StringBuilder()
FileInputStream(this).use {
val bufferedReader = BufferedReader(InputStreamReader(it, Charset.defaultCharset()))
var line = ""
while (bufferedReader.readLine()?.also { s -> line = s } != null) {
builder.appendln(line)
}
}
return builder.toString()
}
为啥呢?因为其他的方式,根本不用写啊。
Android 获取各种目录
- Context 本身的方法(获取应用本身相关的目录,卸载时自动删除)
- getCacheDir() 获取 /data/data/package_name/cache
- getFilesDir() 获取 /data/data/package_name/files
- getExternalCacheDir() 获取 SDCard/Android/data/package_name/cache
- getExternalFilesDir() 获取 SDCard/Android/data/package_name/files
- Environment 方法
- getExternalStorageDirectory() 获取 SDCard路径,配合Environment中的静态变量,可获取常见如 DOWNLOAD、MUSIC 等目录
官方文档:内置/外置
https://developer.android.com/training/data-storage/files/internal?hl=zh-cn
https://developer.android.com/training/data-storage/files/external?hl=zh-cn
DialogFragment 全屏
The easiest way to show a full-screen DialogFragment
这文章也不错~
使用 Kotlin Coroutines 開發 Android App 快速上手 part2— LifecycleScope
至于需要透传:(可用于做 Toast 之类的,让点击事件传递给下层 Fragment 之类)
dialog?.window?.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
需要隐藏底部虚拟按键:(不让其获取焦点,但这样dialog貌似没法拦截 back 事件 会直接返回上层,但可以在 fragment 中拦截)
dialog?.window?.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
关于一些 exception:对于 dialog,最好是用
dismissAllowingStateLoss()
此外,如果 show 时用的 childFragmentManager,那 dismiss 时需要先判断是否为 null,不然~就是这not associated with a fragment manager.
异常了。
本站由以下主机服务商提供服务支持:
0条评论