Android

分类下相关文章

Android 图表库 MPAndroidChart

为了在 Android 平板上实时展示血氧和心率的曲线图,需要找一个三方的 chart 库。 Android Chart 库的选型 https://github.com/PhilJay/MPAndroidChart , 37K star 但是 4 年前就不再更新了。但是实测并没有兼容性问题 (Android 12, 及华为鸿蒙3) https://github.com/diogobernardino/williamchart , 这个确实很漂亮,而且是 kotlin 实现的,但是看起来不如 MPAndroidChart 灵活。 MPAndroidChart 的使用 添加依赖 ...

阅读全文...

Android Kotlin 点击按钮跳转至系统语言切换设置页

需求 在 Android 多语言 App 内切换语言,为了节省开发工作量,直接复用系统的语言切换功能。 即,点击一个 App 内的语言设置按钮,跳转至 Android 系统的语言切换功能页。 实现 import android.content.Intent import android.provider.Settings binding.appSetting.setOnClickListener { val intent = Intent(Settings.ACTION_LOCALE_SETTINGS) startActivity(intent) } 效果 效果非常好。而且 ...

阅读全文...

android AppCompatButton 设置按下时显示的背景图片

即一个 Android Button 在正常显示时,跟按下时,显示不同的背景图片。 通常按下时显示的是另一张高亮的图片。 之前是通过点击事件实现的,无意发现 drawable selector 可以方便的配置实现,这样代码也清晰了很多。 drawable selector 右键点击 res/drawable 目录,选择新建一个 Drawable Resource File,Root Element 是 selector。 命名为 button_bg.xml <?xml version="1.0" encoding="utf-8"?> < ...

阅读全文...

dp, sp, px 与 Android 界面布局自适应

之前写 Android 平板 App,由于没有正经写过 Android 界面布局,为了图省事, 直接用 px 像素做的布局,及字号大小设置。 好在平板是我们指定的型号,屏幕尺寸,及像素。但是自从发货到客户手中之后, 我就非常担心,一旦这款平板停产,换个更高分辨率的平板怎么办? 为了消除焦虑,我了解了一下 Android 布局的基础。 总结起来一句话: 字号用 sp,宽高用 dp。 问题简化 图片宽度用什么单位? dp 字号用什么单位?sp dp 是什么? dp 是怎么换算为 px 的? dp 是怎么换算为 px 的 android 中,dp 在渲染前,都会被转换成 px。 px = den ...

阅读全文...

Android 点击设置菜单条目,基于 DialogFragment 实现弹窗

DialogFragment 在 android 3.0 时被引入。是一种特殊的 Fragment,用于在 Activity 的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。在 DialogFragment 产生之前,创建对话框:一般采用 AlertDialog 和 Dialog。注:官方不推荐直接使用 Dialog 创建对话框。使用 DialogFragment 来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和 Fragment 有着基本一致的声明周期。且 DialogFragment 也允许开发者把 Dialog 作为内嵌的组件进行重用,类 ...

阅读全文...

Android 点击按钮显示悬浮菜单

需求 点击 Android 屏幕上的设置按钮,弹出一个悬浮菜单,显示具体的细分配置功能。例如: 时间设置 语言设置等 Material Design Menu 组件 https://github.com/material-components/material-components-android/blob/master/docs/components/Menu.md 也可用过输入框的下拉列表。 overflow, context, popup 的区别 Dropdown Menu 又细分为几种类型: Overflow menu: 溢出菜单,即 Android 界面右上角三个点,点开后显示 ...

阅读全文...

android AppCompatButton 设置背景图片

遇到一个奇怪的问题,在 Android 项目中给 Button 设置背景图片,总是不生效。 <Button android:background="@drawable/normal" android:text="OK"> </Button> 改用 androidx.appcompat.widget.AppCompatButton <androidx.appcompat.widget.AppCompatButton android:background="@drawable/normal" and ...

阅读全文...

Android APP 设置版本号,并显示在界面上

由于给客户定制的 Android APP 不需要发布到应用商店,没有一套统一的版本控制渠道。 只能先通过人肉查看版本号的方式,将版本号显示在界面上。 设置版本号 app build.gradle 文件: 通过 versionCode 和 versionName 来配置 App 的版本号。 android { namespace 'com.sunzhongwei.app' compileSdk 33 defaultConfig { applicationId "com.sunzhongwei.app" minSdk 2 ...

阅读全文...

Android Kotlin 对字节 byte 中的某一位 bit 取反

Android Kotlin 中,需要对字节 byte 中的某一位 bit 取反 取反代码 fun toggleBit(byteValue: Byte, bitIndex: Int): Byte { // Convert the Byte to an Int to perform bitwise operations val intValue = byteValue.toInt() // Create a mask with the bit at the specified index set to 1 val mask = 1 shl bitIndex ...

阅读全文...

Android Studio 中修改 App 的包名

需求背景 一套 Android 蓝牙控制硬件设备的程序,每个客户端界面和逻辑都有比较大的差异,所以想分成 N 个 git 代码仓库进行管理。 为了方便测试,例如在一个 Android 平板上安装多套不用版本的 App 进行测试,就需要区分开每个 App 的包名。 修改流程: 改包名 Android 视图下,右键点击 java 目录下的 com.sunzhongwei.app,选择 refactor - rename , 修改成新的名称。 例如:com.sunzhongwei.app2 app build.gradle namespace, 及 applicationId 修改包名。 其他文件 ...

阅读全文...

Android LiveData 实战总结

这周在重构一个 Android 平板蓝牙控制的 App,之前为了赶工期,代码写的比较乱, 正好这段时间赶上多个客户的定制要求,发现要一套代码实现多套差异化的需求,如果代码不好好规整根本改不动。 自己欠的技术债,总归是要还的。 在改造的过程中,发现之前使用 LiveData 的方式有不少问题,总结一下: 逻辑不要放在 Fragment 中 能在 ViewModel 中处理的,尽量在 ViewModel 中处理。 Activity / Fragment 尽量只监听 LiveData, 然后直接显示,不做任何复杂的逻辑判断。 集中在 ViewModel 处理,逻辑更清晰。 多个 Fragment ...

阅读全文...

Android Fragment 实现对蓝牙设备的参数配置页面

新建 fragment 新建一个 Blank Fragment。会自动创建对应的 layout xml 文件,但是 binding 需要自己手写。 layout binding package com.sunzhongwei.ble.settings import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.sunzhongw ...

阅读全文...

NordicSemiconductor/Android-BLE-Library 监听连接状态变化

监听的目的 Android App 界面显示当前的蓝牙连接状态:断开/连接中/已连接 在断开时,自动重连 如何监听连接状态 (已废弃) 在 NordicSemiconductor/Android-BLE-Library 官方文档中没有找到相关的说明。 只能在 github 中搜索 no.nordicsemi.android.ble.BleManager 的 kotlin 代码。 确实找到不少参考项目。 例如: https://github.com/fbiego/ESP32_BLE_OTA_Android/blob/d10f6546f4371dd811767b5b4958c2aa891697 ...

阅读全文...

Android BLE 蓝牙操作设备三方库 NordicSemiconductor/Android-BLE-Library

为何要使用三方库 起因是我写的 Android 低功耗蓝牙 App 有几个现存的问题: 写操作的并发问题导致写入失败,需要一个队列。iOS 内置了这个实现,甚至连微信小程序都实现了,但是 Android 官方没有实现,渣渣。 信号不稳定,蓝牙断开连接,需自动重连 未来需要连接多个蓝牙设备,但是我目前的架构不支持 如果设备信息进一步增多,就要涉及到数据包的拆分,组合 我去自己实现,非常耗费时间,在我看来都是非常基础的功能。不如找个三方稳定的实现。 NordicSemiconductor/Android-BLE-Library 介绍 https://github.com/NordicSemic ...

阅读全文...

android gradle 依赖版本号统一管理

在项目级 build.gradle 文件中 在 ext 代码块中定义 room_version。 ext { kotlin_version = "1.6.20" nav_version = "2.4.1" room_version = '2.4.2' } 在应用级 build.gradle 文件中 在依赖项列表末尾添加以下依赖项。 implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compi ...

阅读全文...