大象笔记

知者行之始,行者知之成

Android RecyclerView Adapter ViewHolder 中获取 Activity

之前记录过如何在 Fragment 中获取父级 Activity,这次发现需要在 RecyclerView Adapter ViewHolder 中获取 Activity。 简单来说,就是: get Context from the view 例如,ViewHolder 中包含一个 text view 用来显示姓名,可以借此获取 context,从而得到 Activity. (binding.name.context as ItemDetailHostActivity).stopSomething() ...

阅读全文...

拔牙记,第二颗智齿报废

最近一周左下侧智齿发炎,牙龈都肿了,吃饭都困难,晚上回到家状态就跟发烧一样。 赶紧去门口黑心药店买了盒甲硝唑,先消炎消肿,再去拔牙,担心没消肿医生不给拔牙。 同时,在手机微信上预约烟台开发区口腔医院的挂号,可能预约的晚,周末基本没啥号。于是约了周一上午的副主任医师的号。 拔牙过程折磨人 距离第一次拔牙好多年,我印象中很简单,就直接用钳子硬拔下来。 但这次各种磨,各种薅,取出来的牙碎片有近 10 块。 这次多了个助理,全程抽血水,体验好很多,但是依旧起身吐了两次。 历时一个多小时,才处理完。感觉过程无比漫长,而且有点呼吸困难。 麻药劲太大 拔完牙,半边脸都是麻的。。。拿纸杯喝水,感觉嘴唇左边一半 ...

阅读全文...

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

阅读全文...