抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

2020.10 第一周目 踩坑小记

记一次问题分析错误

背景: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条评论

发表评论