Android

分类下相关文章

在易版权上第一次提交软件著作权申请失败

由于我想将 Android App 上架国内的小米应用商店,按照要求上架必须先注册软件著作权。小米官方推荐使用易版权,于是我就图省事,直接在这个网站上申请了。相对官方的版权保护中心,易版权有一个优势,就是不需要你脱裤子放屁再邮寄一份纸质资料,只需要额外打印并扫描上传一份授权书。 易版权在填写软著的过程中,提示非常详细,比官方网站详细太多。虽然界面比较丑,且体验差劲。但是忍了,为了上架,根本没得选择。 提交后,我天天刷新看进度,无论等几天,永远是 剩余天数:36天 大概是故意来恶心人的。一个做软件著作权的网站,软件做成这样,本身就是一种讽刺。 大概过了一个周,还是两个周,短信提示我申请失败: ...

阅读全文...

Google Play 应用名称长度变更

今天在提交 Google Play 应用市场时,发现商品详情页好多国家的翻译出现了警告图标。 打开一看,都是提示应用名过长,超出了规范。可是之前都是正常的啊。 原来,Google 调整应用名长度,从 50 个字符,缩减为 30 个字符。 您的“应用名称”可能不符合即将实施的应用元数据政策变更:不得超过 30 个字符 详情参考: https://android-developers.googleblog.com/2021/04/updated-guidance-to-improve-your-app.html 其他的调整限制 不得暗示自己的 app 排名,例如 top 这样的关键词,以及图 ...

阅读全文...

Kotlin Enum 的 Android i18n 翻译问题

我定义了一个 enum 类: enum class ShelfLifeUnit { DAY, WEEK, MONTH, YEAR; 但是在真实项目中使用时,会发现如果要实现多语言版本,enum 不太好处理啊。。。 例如,在 Jetpack Compose 中,下拉列表的每一条对应一个 enum 项,需要使用不同翻译时: ShelfLifeUnit.values().forEach { label -> DropdownMenuItem(onClick = { itemViewModel.setCurrentItem(item.copy(shelfLifeUnit = la ...

阅读全文...

Jetpack Compose 中使用更多 material 图标

我在 Compose 中使用图标,但是默认情况下, androidx.compose.material.icons.Icons 提供的图标很少。 import androidx.compose.material.icons.Icons Icon( Icons.Filled.CheckCircle, contentDescription = "Date Picker" ) 很多在 https://fonts.google.com/icons?selected=Material+Icons material icons 中有的图标,都找不到。比如我想找一个日期选择的图标 ...

阅读全文...

Jetpack Compose 中使用 Snackbar 提示信息

之所以想记录一下 Jetpack Compose 中 Snackbar 的使用,主要是发现 Snackbar 代码示例引入了两个我没有见过的概念: rememberScaffoldState rememberCoroutineScope snackbar 中文是,小吃店 ... snack, 小吃的意思。 snackbar 的交互形式非常独特,是屏幕底部出现一条横幅,包含提示信息。还可以内置一个按钮,例如撤销操作等。 Compose 中 Snackbar 的使用 val scaffoldState = rememberScaffoldState() val scope = remember ...

阅读全文...

Jetpack Compose 配合 Room, ViewModel 操作数据库

放到一个文件中? 感觉 entity, dao, repository 可以放到一个文件中, 但是 database 还是需要独立出来,因为一个 database 可能包含多个 entity。 这样找 entity 进行修改时比较方便。 为何需要 ViewModel 屏幕在横屏、竖屏旋转切换时,Activity 会被重建。如果临时状态数据存储在 Activity 中, 横竖屏切换后,会导致状态重置,例如计数器重置,出现 bug。 所以,需要一个能保存状态的机制,于是有了 ViewModel。 为何需要 ViewModelProvider.Factory 在 Todo Demo App 中,可以 ...

阅读全文...

Jetpack Compose 使用 MutableLiveData 及 observeAsState 实现详情页的数据查询

思路 对 viewmodel 中 livedata 的监听也是返回一个 state. 但这个 state 是不能像 compose 内的 state 直接修改的。要修改,需要调用 viewmodel 中的函数来间接修改。 尝试过的方案 方案一(失败):ViewModel 中定义 mutableStateOf, Composable 中定义 mutableStateOf。mutableStateOf 看起来是初始化那一刻用的啥值,就是啥值,无法自动更新。 方案二(可行):ViewModel 中定义 MutableLiveData,Composable 中使用 observeAsState 监听 ...

阅读全文...

jetpack compose 日期选择组件

发现目前正在用的 jetpack compose 中没有现成的 Material Design 样式的日期选择组件。 在 Stack Overflow 上找到一个解决方法: AppCompatActivity instead of ComponentActivity in Jetpack compose class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ...

阅读全文...

Jetpack Compose State

目标 目标是写一个基于 jetpack compose 的表单页面,用于将一系列产品数据存储于本地 sqlite 数据库中。 但是真正动手时,发现不知道如何获取 input 组件的输入值,这不再是 findbyid 那种获取输入值的形式。 所以,不得不了解一下 compose state 的机制。 还有另外一个疑问。对于 data class 这样的多字段结构化数据,state 机制如何方便地映射到每一个输入组件上。 什么是 state State in an application is any value that can change over time. For example it ...

阅读全文...

Jetpack Compose 多界面间的路由跳转

目录结构 一个简单 Demo 的文件分离结构: Home Screen:首页列表 Edit Screen (detail):编辑页 NavHost (router):路由定义 Main Activity 添加依赖 dependencies { implementation "androidx.navigation:navigation-compose:2.4.0-alpha08" } 添加之后,不要忘了点击 Android Studio 右上角的 Sync Now。 否则像 rememberNavController 这样的函数,无法通过 Alt + Ente ...

阅读全文...

Jetpack Compose 1.0 版正式发布

我期待已久的 Android Jetpack Compose 终于出 1.0 正式版了。 正好有个 App 的小功能想实现,决定用 Jetpack Compose 实现。毕竟 XML 布局写列表太复杂了,一时不用,就忘了怎么实现。 连复制黏贴都没有头绪。而 Compose 相对简单很多。不知道鸿蒙是否能跟进,:) 周五晚上闲的没事就把家里台式机上的 Android Studio 做了升级。 对应的 Android Studio 版本 Android Studio Arctic Fox (2020.3.1) Stable 正式支持了 Compose,在新建 Activity 时,可以选择 Com ...

阅读全文...

对您的 AdMob 帐号设置了临时性的广告投放限制

早上起床收到一封 Google Admob 的邮件: 对您的 AdMob 帐号设置了临时性的广告投放限制 我们会继续评估您的流量,并自动审核和更新此限制。通常,广告投放限制对发布商的影响不会超过 30 天,但在某些情况下,影响时间可能会更长。很遗憾,我们无法确定具体需要多长时间。 在此期间,您的帐号仍然可以正常使用,您可以在合作规范中心查看这一帐号级问题的详细信息。 登录 Google Admob 后台会看到醒目的提示: 广告投放受到限制 您可以展示的广告数量受到限制。要了解详情,请前往合作规范中心。 悲剧了,这个月好不容易挤出来时间上线了两个 Android APP,看来是没法赚广 ...

阅读全文...

更好用的 Android 项目 I18N 翻译编辑器

在给 Android APP 做多国语言翻译时,感觉 Anroid Studio 内置的 I18N 翻译编辑器还是不好用。 因为我都是用的 Google 翻译,所以需要一个单词一个单词的复制进去,效率极低。 我想写一个效率更高的翻译编辑器客户端。 需求 翻译复用 自动填写翻译,与google同步 或者google导出的翻译格式,自动解析成对应的项目配置文件 没有翻译的自动填充英文 技术选型 tampermonkey 自动提取 Google 翻译 python 自动操作 strings.xml 文件 扩展 web 端各框架 ...

阅读全文...

Google Play Android App 卸载率高的原因分析

最近新开发了一个 Android App,在 Google Play 上发布,应用商店了翻译了 40+ 语言,但是应用内只翻译了中文和英文,想先看看 Google Play 的搜索效果。 观察了两天,搜索效果比预期要好,转化率也挺高。 但是出现了一个非常严重的问题,就是卸载率接近 100% ... 卸载率高的原因分析 应用内没有对应翻译。 前期安装用户,多来自于小语种用户,集中在南美,例如巴西。 而巴西用户的主要语言葡萄牙语,并没有加应用内翻译。 我猜测,用户可能看不懂英文导致卸载。 解决方案 先补充应用内翻译。 先行补充了三门语言 葡萄牙语。针对巴西市场。 日语 韩语 再发布一版,顺便加 ...

阅读全文...

Android 按钮样式区分,使用内置 Material Design 样式

背景 经常会遇到在 Android 界面中需要添加两个并排的按钮,例如: 一个确定按钮 一个取消按钮 两个按钮需要有颜色的区分,能明显分辨出 Primary, Secondary 的属性。 每次都现找颜色,是非常浪费时间的事情。所以我需要一套主题。 而 Google 的 Material Design 恰好为 Android 的主题而生。 首先添加依赖 https://github.com/material-components/material-components-android/blob/master/docs/getting-started.md implementation 'c ...

阅读全文...