大象笔记

知者行之始,行者知之成

Android RecyclerView 嵌套显示 BLE 蓝牙 Service 的 Characteristic 子项

例如,外层 RecyclerView 显示的是一个 BLE 蓝牙设备的 Service 列表; 内存嵌套的 RecyclerView 显示的各个 Service 所包含的 Characteristic 特性列表。 点击展开 Service,显示其所包含的特性。 RecyclerView 嵌套 首先在父级 RecyclerView 的 Item Layout 中定义一个子 RecyclerView 控件 嵌套的 RecyclerViewAdapter 绑定逻辑,在父级 RecyclerViewAdapter 的 onBindViewHolder 中实现 item:BluetoothGattC ...

阅读全文...

无人机控制的一些基础概念

周末听人讨论了半天的无人机控制,各种名词都是头一回听闻,于是搜索了一番,记录一下。 陌生的新名词 mission planner。地面控制站的一种。 QGroundControl。地面控制站的一种。 Pixhawk:飞行控制器的一种,即飞控。 mavlink。控制协议。 地面站 (Ground Control Station) QGroundControl QGroundControl(QGC)是一个开源无人机地面站(Ground Control Station)系统。由 Qt 开发的界面部分,可以运行在 Windows、Mac OS、Linux 及 Android 和iOS 等主流操作系 ...

阅读全文...

Android Primary/Detail Flow 模板的 fragment 点击跳转逻辑

TODO 看懂原有 primary/detail 模板的跳转逻辑 新建 snippet list fragment override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val itemDetailFragmentContainer: View? = view.findViewById(R.id.item_detail_nav_container) setupRecyclerView(recyclerView, itemDetailFragmentContainer) } private ...

阅读全文...

gorm soft delete 的唯一索引问题

bug 今天测试我的添加、修改接口时,发现一个联合唯一索引不生效。 有问题的表结构: CREATE TABLE `card` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `deleted_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ux_name_del` ...

阅读全文...

Android 复制文本到系统剪切板

需求 我正在开发的一个 Android App,其主要功能就是将扫描出来的蓝牙设备信息,自动复制到手机剪切板。 然后复制到其他需要配置的地方。 例如,点击蓝牙设备的 Mac 地址,自动写入剪切板。 复杂的实现 看了官方文档,发现要实现这么个简单的功能,远比想象中复杂。 https://developer.android.com/develop/ui/views/touch-and-input/copy-paste 操作反馈。Android 13 之后,在写入剪切板之后,会有自动的提示。而低版本就需要自己去实现提示,Toasts 或者 Snackbars。 fragment 与 activit ...

阅读全文...

android fragment 中调用父级 activity 中定义的方法

需求场景 一个 list / detail 的小 android app,分为两个 fragment 置于一个 activity 中。 list fragment 底部一个按钮,点击需要调用 activity 中的一个方法。 解决方法 (activity as YourActivityClassName).methodName() 实际上这个问题可以简化为,如何在 fragment 中获取其父级 activity。 由于 fragment 必然寄生于一个宿主 activity,所以可以直接通过 getActivity() 方法来得到宿主 activity,而 Kotlin 中则可以简写为 a ...

阅读全文...

registerForActivityResult 解决 startActivityForResult(Intent!, Int): Unit is deprecated. Deprecated in Java

举两个例子 例子一:开启蓝牙 废弃的 startActivityForResult 写法: const val ENABLE_BLUETOOTH_REQUEST_CODE = 1 val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) startActivityForResult(enableBtIntent, ENABLE_BLUETOOTH_REQUEST_CODE) 新的 registerForActivityResult 写法: val enableBtIntent = Intent(Bluetooth ...

阅读全文...

设置 Android Studio 在保存时自动对代码进行格式化

写 Android 还是用 Android Studio 能快一点,毕竟我这种入门级开发者,东拼西凑的代码,很容易出现各种警告、错误,用 Android Studio 的自动修复非常节省时间。这一点甚至比 Visual Studio 都强大许多。 但是,唯一不爽的是,AS 没有默认开启代码的自动格式化。 这个对我来说太重要了,习惯了 VIM 里对 golang,js 等代码的自动格式化,很难回头。 开启保存时自动格式化 Android Studio 版本:Dolphin 2021.3.1 build on September 1, 2022 File - Settings - Tools - ...

阅读全文...

Android Primary Detail Flow 模板

想实现一个 Android APP 扫描附近 BLE 蓝牙设备,并显示其服务、特性 UUID,及对应 Handle,CCCD。 尽量能自动化,并加快目前一个项目中用到的蓝牙网关配对的过程。 界面展示类似于列表加详情页的形式,恰好 Android Studio 里内置了这种模板,即 Primary/Detail Flow。 里面的列表页与详情页是用两个独立的 Fragment 实现的。 入口在哪里 因为 Fragment 并不能单独使用,他需要嵌套在 Activity 中使用。 > tree app/src/main/java/com/sunzhongwei/ble/ app/src/ma ...

阅读全文...

kotlin 中 object,companion object,class,data class 的区别

object a static instance of a class that there is only one of, otherwise known as a singleton 类似单例 singleton 整个 app 只有唯一一个实例 不需要创建 instance 实例,就能访问里面的属性、方法 第一次访问的时候,进行初始化,即 initialised lazily 例如: object Tool { fun checksum { // ... } } Tool.checksum() companion object compani ...

阅读全文...

WPF ComboBox 绑定 Dictionary / Array 作为数据源

在用 .NET 6 WPF 开发一个自动化翻译的 Windows 客户端软件,需要增加一个下拉控件可以选择 Locale。 WPF 中对应的组件时 ComboBox。与 listbox 的不同之处在于,combobox 是折叠收起的,而 listbox 的是展开显示的。 combobox 贴心之处在于,除了能下拉选择,还能手动输入内容。 CSharp 代码中绑定 dictionary / array 尽管有几种方式可以实现数据的绑定,但是我还是喜欢在 CSharp 代码中绑定,因为比在 XAML 中清晰多了。 注意:如果想在设计器里点来点去实现绑定,需要随时做好应对 VS IDE 卡死的状况。 ...

阅读全文...

微信小程序支付多商户分账功能

分账介绍 https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=24_1&index=1 还能分账给个人零钱账号 无分账手续费 实际分账时,服务商传入具体的分账接收方和分账金额进行订单分账。分账接口分为单次分账接口和多次分账接口。一笔订单最多可以分50次,每一次可以分给50个接收方。 服务商分账功能需要特约商户授权且设置允许服务商分账的最大比例 如果采用的是支付先到三方商户,再分账给小程序主账号关联的商户,一个小程序最多关联 50 家商户,这个上限需要注意 分账流程 预支付下单时,添加分账 profit ...

阅读全文...