大象笔记

知者行之始,行者知之成

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 ...

阅读全文...

2021春节假期第一天在医院度过

今天春节假期第一天,正好赶上媳妇产检的日子,而我也准备顺便去医院检查一下。 我的症状 近一个月右下腹部贴近肋骨处,晚上间歇性疼痛,白天要轻很多,甚至没有感觉。但是有点影响睡眠质量。一个月有个三两次,一次持续两天左右。 我自己百度了一下。。。知道那个位置是肝、胆、胰等器官。症状上看,有点像胰腺炎,但是又没有很多典型症状。总之,有点担心,还是去医院检查一下比较好。有一天疼的不行,正准备请假去医院,突然不疼了。。。所以想不如产检时顺便看看吧,省的担心,把自己吓坏。 医院检查 早上把媳妇送到毓璜顶一楼产检处,我就去二楼挂了个消化内科的号。医生问我有没有乙肝,我说没有。无法直接定位问题,就让我先去做个血 ...

阅读全文...

withContext(Dispatchers.IO) 与 viewModelScope.launch(Dispatchers.IO) 的区别

CoroutineScope withContext lifecycleScope viewModelScope 该如何选择 CoroutineScope, withContext, lifecycleScope, 和 viewModelScope 是 Android 中用于协程管理的不同组件和类。这些组件和类可以帮助您在 Android 应用程序中正确地使用协程。 CoroutineScope:是一个顶层接口,用于管理协程以及它们运行的线程。您可以使用GlobalScope创建全局作用域,但通常建议为每个组件或任务创建自己的范围,以便在需要终止时可以更好地控制它们。 withConte ...

阅读全文...