大象笔记

知者行之始,行者知之成

Material dialogs MaterialAlertDialogBuilder 中添加文本编辑框

setView 官方 Material Design 3 的文档中并没有详细的 MaterialAlertDialogBuilder 使用说明。 https://github.com/material-components/material-components-android/blob/master/docs/components/Dialog.md 找不到如何在里面添加文本编辑框。 但是在接口文档中可以看到有一个 setView 的方法 https://developer.android.com/reference/com/google/android/material/dialog/Ma ...

阅读全文...

BLE Indications 与 Notifications 的区别

BLE 的一个特性可能包含五种 property: Read Write Write No Response Notify Indicate Notify 和 Indicate 都是订阅蓝牙设备的推送消息。 但是 Indications 与 Notifications 有什么需求呢? indication (指示、标示) 需要客户端收到消息后,进行回应。类似 TCP。 notification (通知,通告,告示) 不需要客户端的回应。类似 UDP。 补充 由于 indication 需要应答,所以相对而言,效率会低一些 应答的处理,由 Android Bluetooth stack ...

阅读全文...

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() 实际应用场景 例如,在各种嵌套的 RecyclerView Adapter 中想访 ...

阅读全文...

拔牙记,第二颗智齿报废

最近一周左下侧智齿发炎,牙龈都肿了,吃饭都困难,晚上回到家状态就跟发烧一样。 赶紧去门口黑心药店买了盒甲硝唑,先消炎消肿,再去拔牙,担心没消肿医生不给拔牙。 同时,在手机微信上预约烟台开发区口腔医院的挂号,可能预约的晚,周末基本没啥号。于是约了周一上午的副主任医师的号。 拔牙过程折磨人 距离第一次拔牙好多年,我印象中很简单,就直接用钳子硬拔下来。 但这次各种磨,各种薅,取出来的牙碎片有近 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 - ...

阅读全文...