大象笔记

知者行之始,行者知之成

在 RecyclerView 条目数超过一屏时,下拉滚动导致 checkbox 状态混乱

Bug 现象 陪媳妇在医院生二娃的时候,用自己新开发的一个 Todo 管理的 Android App 记录待办事宜。当待办事项列表条目很多,超过一屏,此时下拉滚动查看更多事项,会发现这些待办事项的完成状态发生错乱。并且引发我的壁纸生成机制被频繁触发,功能失效。。。 由于记录的事情太多也很重要,引起极度不适,气得我差点卸载,给自己 Google Play 上 1 星差评。 导致 checkbox 状态混乱的原因 为了节省内存,RecyclerView 滚动时,会将移出可视范围、不可见的条目做回收。 如果条目中 (View Holder)包含 CheckBox,在回收时,会自动将 CheckBox ...

阅读全文...

二闺女出生

下午四点出生,长得跟大闺女真像啊。从此又多了一个小跟屁虫。 早上八点媳妇进产房,由于41周还没反应,直接打催产针。大概下午三点,我看产房走廊大屏幕,状态由催产状态变为产程中。焦急地等了一个小时,小牛就出生了。 今天产房走廊就三五个人,比之前人少太多了。而且有了大屏幕实时查看状态,估计陪产的很多人中途就回房间躺着了。我反正就中途回去睡了两觉。 昨天两万步,今天近一万步,现在只想躺着睡一觉。 ...

阅读全文...

Android I18N 国际化语言的选择,及上架 Google Play 的策略

最近又写了一个 Android App,基本功能已实现,又面临 I18N 国际化的语种选择问题。 基本翻译策略 优先实现英文版 Google Play 应用介绍先翻译前十大语种。界面先不着急翻译,等 Console 统计数据出来再选择性翻译。因为界面翻译更繁琐,耗时。 前十大语种/语言 我是参考 wiki 上的总使用人数来排序的,即,母语与第二语言合计的人数: 汉语(11.2亿) 英语(4.8亿) 西班牙语(3.2亿) 俄语(2.85亿) 法语(2.65亿) 印地语/乌尔都语(2.5亿) 阿拉伯语(2.21亿) 葡萄牙语(1.88亿) 孟加拉语(1.85亿) 日语(1.33亿) 参考: ...

阅读全文...

Android Fragment 顶部工具栏显示回退按钮

场景 一个 Main Activity,多个 Fragment 组成的 Android App。 界面1,列表页:list fragment 界面2,详情页:detail fragment 当列表页进入详情页时,想在 fragment 顶部的 toolbar 看到回退按钮。 kotlin 实现代码 由于这里的 toolbar 输入 Main Activity,所以在 Activity 里添加: private lateinit var appBarConfiguration: AppBarConfiguration override fun onCreate(savedInstanceS ...

阅读全文...

Android 11: IntentService is deprecated

使用 IntentService 实现了一个耗时的功能,但是 Android Studio 编译时警告: IntentService is deprecated 官方文档 https://developer.android.google.cn/reference/android/app/IntentService This class was deprecated in API level 30. IntentService is subject to all the background execution limits imposed with Android 8.0 (API le ...

阅读全文...

Android Activity 中点击 action bar 按钮,跳转 Settings Fragment

需求 想实现点击 app bar / action bar 上的一个按钮,跳转到设置功能页,即 Settings Fragment。 findNavController 实现跳转 由于 action bar 在 main activity layout 中,并不属于任何一个 fragment,所以需要在 activity 中实现。 参考 Fragment 中的 findNavController 用法: findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment) 在 Activity 中使用 findNa ...

阅读全文...

Android App Bar / Action Bar 添加按钮

想要在 Android App 中添加一个配置页面,用来进行基本设置调整。例如: 修改字体大小 修改字体颜色 修改背景图片 对比了一下使用 BottomNavigationView 底部 tabbar 的方案,感觉还是 app bar 比较直观一些。 app bar 也称为 action bar,在界面顶部。新建 Basic Activity 时,自带功能。 https://developer.android.google.cn/training/appbar 将默认的折叠项显示出来 修改 menu xml 文件 <item android:id="@+id/action_ ...

阅读全文...

Django LTS 版本的选择 (2021 年)

最近又要做 Django 版本的选择了,于是整理了一下。 Django 版本列表 参考官方网站的下载页 https://www.djangoproject.com/download/ Django LTS 版本的维护时间 LTS 版的维护时间在 3 年 非 LTS 版也就 1 年出头 2.2 LTS 还是 3.2 LTS 2019 年后到 2021 年初只有四个版本 2.1 2.2 LTS 3.0 3.1 目前看等 3.2 LTS 是值得的,2021 年 4 月发布。 可以先用 3.1 进行开发,然后迁移到 3.2 LTS。 Django 3.2 LTS 版本需要注意的改动 参考 ht ...

阅读全文...

Android Room Entity 为某个字段添加索引

担心 Android 本地 SQLite 数据库存储数据过多时,造成查询效率下降,所以想给字段加上索引。 添加索引示例 例如,我想给待办事项这个表(todos)的完成状态字段(done)添加索引。 设置 indices 即可: @Entity( tableName = "todos", indices = [Index(value = ["done", ])] ) data class Todo( var title: String, var content: String, ) { @PrimaryKey(aut ...

阅读全文...

RecyclerView 子项 View Holder 的点击事件响应

需求 点击 RecyclerView 中的一个 checkbox 子项,更新本地 sqlite 数据库中的一行数据的选中状态字段。 方案对比: 方案一 (不可行):使用 Data Binding 事件处理机制中的 listener binding。 参考 https://developer.android.com/topic/libraries/data-binding/expressions#listener_bindings 采用这个方案,就能把事件响应方法放在 Fragment 中,也就可以使用 Fragment 中的 View Model 了,进而进行 Room Update 操作。 ...

阅读全文...

Android Hilt 实现依赖注入的自动化管理

Android Sunflower Demo 中看到这样一段代码: import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class PlantListViewModel @Inject internal constructor( plantRepository: PlantRepository, private val savedStateHandle: SavedStateHandle ) : ViewModel() { // ... ...

阅读全文...

Android RecyclerView 展示数据列表

RecyclerView 的用途 recycle,回收,使再循环的意思。 用于展示列表数据,通常量很大。如名字所示,RecyclerView 可以循环使用已创建的 view,以提升性能。 RecyclerView 的添加步骤 layout XML 中添加 RecyclerView layout XML 中设置 LayoutManager。用于设置子项的排列布局方式,例如:LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager。 Adapter 中实现 RecyclerView.ViewHolder。view holde ...

阅读全文...