Android

分类下相关文章

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 LiveData

可以包含任何类型的数据,通过监听 LiveData,在数据发生变化时,可以立即得到通知。 LiveData 与 ViewModel 通常 LiveData 定义在 ViewModel 中,然后在 Activity / Fragment 中监听 LiveData 的变化。 不在 Activity 中定义 LiveData,原因有两点: 防止 Activity / Fragment 过于臃肿。要分工明确:Activity / Fragment 只负责显示数据;ViewModel 负责存储数据及状态。 防止 Activity 因屏幕旋转被销毁,状态数据消失。而存在 ViewModel 中就能很好的 ...

阅读全文...

'constructor Handler()' is deprecated. Deprecated in Java

使用 Android 官方文档的示例代码,10 秒后停止扫描附近的蓝牙设备,报错: 有问题的代码 import android.os.Handler private val handler = Handler() handler.postDelayed({ scanning = false bluetoothLeScanner.stopScan(leScanCallback) }, SCAN_PERIOD) 警告提示: 'constructor Handler()' is deprecated. Deprecated in Java 解决方法 import android.os. ...

阅读全文...

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

阅读全文...

荣获一张搞笑证书:Google Play Store Listing Certificate

这个证书的中文名是:Google Play 商品详情证书。主要是在 Google Play 里发布 App 相关的一些规范和技巧,倒是有不少的实用的内容,比如 App 名字规范、简介规范、详情规范等。对我而言,可以规避一些无效、或者违规的 ASO 尝试。 通过了 Google Play 商品详情证书考试,即可获得证书。 比较奇葩的是,学习课程是中文的,考试的时候是全英文的,大概 70 道题,我花了一个多小时考完,佩服自己的耐心。考完后头昏脑胀,感觉不值得浪费这个时间。基本上能看懂英文的都能通过这个考试吧,即便没有学过这个课程。 通过考试后,3个工作日会收到 Google Play Store ...

阅读全文...

Google Play 商品详情的描述规范

趁着 Google Play 最近搞的一个学习活动,了解了一下谷歌应用市场的优化技巧。 产品介绍的写作思路 面向的特定用户群体:例如,孩子家长,研究生,程序员之类 其他 app 没有的特色功能 常用功能有哪些?用户对哪些功能赞不绝口。 使用应用能获得什么优势? 你对应用最满意的部分是什么 是否有订阅内容 隐私保障 避免使用的词汇 免费 完美 最佳 排名第一 顶级 新 折扣 促销 百万次下载等 立即下载 立即安装 立即开始游戏 立即体验 避免堆砌关键词 这个是 Google 明确指出的。 而我恰好有这个习惯,这个做法在 baidu 和 bing 上屡试不爽。 但是确实对 Google 效 ...

阅读全文...

RecyclerView Layout Weight

例如,我想将 RecyclerView 的高度设置为占据整个屏幕余下的空间。 代码结构 // 外层,例如 LinearLayout android:layout_height="match_parent" // 组件,例如 RecyclerView android:layout_weight="1" android:layout_height="0dp" 如果不设置 layout_height 会遇到运行时错误: you must supply a layout_height attribute 如果设置 layout_hei ...

阅读全文...

Material Design 3

官方文档 https://m3.material.io 具体每个组件的代码示例,在 github 上: https://github.com/material-components/material-components-android/tree/master/docs/components 官方主题生成器工具在线版 https://m3.material.io/theme-builder#/dynamic 这个工具的好处是,可以生成主题预览,然后将主题配置导出。 注意: 需要切换到 Custom Tab,然后点击右上角的导出。XML, compose, flutter, css 都支 ...

阅读全文...

Android 通过 ACTION_IMAGE_CAPTURE 拍照获取原尺寸的 bitmap 图片

之前匆匆实现了 Android 拍照功能,但测试时发现得到的图片尺寸都很小,并不是拍照时的原始尺寸。 从官方文档得知原来 ACTION_IMAGE_CAPTURE 从 Intent 得到的是图片的缩略图。 而且解决过程中,万万没想到 Android 官方文档的中文版示例代码有问题,直接用里面的代码根本运行不了。同时,里面不少翻译错误。 需要切换为英文文档,才能跑通。浪费大量时间,服气了。 最终效果 为何直接从 Intent 得到的是缩略图 实际上 Android 官方文档写的也很详细: val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAP ...

阅读全文...

Android 点击 ImageView 组件放大照片进行预览

例如,我想点击图片进行放大,可缩放。找到一个现成的库: https://github.com/stfalcon-studio/StfalconImageViewer/ settings.gradle maven { url "https://jitpack.io" } build.gradle implementation 'com.github.stfalcon-studio:StfalconImageViewer:v1.0.1' click listener imageView.setOnClickListener { val images = listOf(ur ...

阅读全文...

Android 显示加载中状态

例如,我要上传一个比较大的图片文件到服务器,等待处理完成,并接收返回结果。 这个过程可能很漫长,需要等待两秒,这时候我需要一个加载中的状态提示,避免用户不知所措。 Android Kotlin 比较好的实现方式 https://stackoverflow.com/questions/45373007/progressdialog-is-deprecated-what-is-the-alternate-one-to-use 显示效果 实现逻辑 先实现一个 layout_loading_dialog.xml,里面包含一个 ProgressBar 显示转圈,及一个 TextView 显示提示文字 ...

阅读全文...

Android ImageView 控件通过 URL 显示网络图片

要在 Android 里展示服务端接口返回的图片,数据格式是 URL。 Picasso 看起来还是 Picasso 这个库用起来比较方便 implementation 'com.squareup.picasso:picasso:2.8' Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView); Picasso 的优点 异步加载图片。省去了自己手动开线程。 Handling ImageView recycling and download cancelation in an adapter ...

阅读全文...