Adnroid
文章平均质量分 71
安卓系统和开发专栏
李小白lt
kotlin yyds
展开
-
使用插件重命名安卓项目内的资源名称
如果是组件化开发,组件内的资源要重命名,不能和宿主名称相同,否则可能会出现因资源名相同导致宿主资源覆盖组件资源的问题,严重可导致崩溃(比如id找不到导致空指针)所以我们需要给资源进行重命名,手动重命名比较耗时且容易遗漏,因此使用插件。原创 2024-04-25 22:45:11 · 212 阅读 · 2 评论 -
Kotlin空安全类型之平台类型
众所周知,Kotlin的空安全很方便,能避免绝大部分的空安全问题一般类型分为:可空类型如 String?不可空类型 String其中可空类型的String?可以赋值null或String类型的值,在使用时必须显式的进行空处理而不可空类型的String,只能赋值String类型,无法向其赋值null,使用时无需空处理,也不会遇见空指针异常但为什么我上面说能避免绝大部分的空安全问题呢?是因为Kotlin为了兼容其他语言,还有对应语言平台的平台类型 String!原创 2023-07-25 21:38:16 · 298 阅读 · 0 评论 -
Compose中的FlowLayout
Compose库中是没有原生的类似FlowLayout的布局的,于是我们来自己实现一个FlowLayout原创 2022-07-19 20:00:00 · 754 阅读 · 0 评论 -
Compose中的“ViewPager“和Banner
Compose中简单易用的"ViewPager"(ComposePager)和Banner原创 2022-07-19 11:05:43 · 1172 阅读 · 0 评论 -
安卓TextView的lineHeight*lineCount!=height问题,解决不支持滚动的系统下对多页Text进行分页
最近在做运行在墨水屏系统上的程序,由于墨水屏刷新率比较低,所以系统内的软件是不允许滚动和加动画的(在逻辑上)这样就导致了平时在普通安卓手机上很简单的程序,在墨水屏系统上就很麻烦,比如多页的应用,普通安卓机直接搞一个ScrollView和RecyclerView就可以了,但墨水屏系统上你需要自己计算每页展示多少内容,然后在进行分页处理...原创 2022-06-23 15:54:06 · 1123 阅读 · 1 评论 -
安卓使用Span富文本给某段Text文本加上波浪线
前言最近项目需要给某段文字动态的加上波浪线,但是没搜到什么好的方案,于是打算自己实现一下,效果如下:正文本文使用的方案是自定义Span富文本,并在Span中用贝塞尔曲线来绘制出波浪线代码如下:import android.graphics.Canvasimport android.graphics.Colorimport android.graphics.Paintimport android.graphics.Pathimport android.text.style.原创 2022-04-01 15:38:38 · 804 阅读 · 0 评论 -
RecyclerView复杂适配器的终极形态?代码更解耦
前言RecyclerView是Android开发中很常用的控件,市面上也有很多种封装,使其更易用,但是面对复杂的适配器需求,则很难做到逻辑清晰且解耦,比如聊天消息的适配器正文1.首先我们用最原始的方法写一个简单的聊天消息的rv实现图如下:代码如下:class MainActivity : AppCompatActivity() { //数据源: type to data val msgData = mutableListOf<Pair<Int, An原创 2022-01-07 15:50:10 · 3044 阅读 · 4 评论 -
KMM 搭建环境,并运行安卓和ios
前言kmm是Kotlin Multiplatform Mobile(kt移动跨平台)的缩写,虽然目前还不是正式版本,但也是可以用了kmm的跨平台实现方式是将代码分成三块:安卓原生代码ios原生代码kotlin共享代码,其中在安卓部分会将kotlin共享代码编译为jvm文件并当做lib加入到安卓原生代码中,而ios则是将kotlin共享代码编译成native(oc?)代码,然后当做framework引入(图引自kt官网)这样既可以跨平台,又保证了平台灵活性,并且性能相对于flu原创 2021-11-07 01:37:48 · 5673 阅读 · 0 评论 -
Kotlin-如何创建一个好用的协程作用域
前言kotlin中使用协程,是一定要跟协程作用域一起配合使用的,否则可能协程的生命周期无法被准确控制,造成内存泄漏或其他问题.我们一般在安卓项目中使用协程作用域,可能会在BaseActtivity中new 一个MainScope(),并在onDestory时cancel掉,或者只在ViewModel中使用viewModelScope,然后会在ViewModel的onClose中自动cancel掉.但我们可能不只需要这些效果,比如在协程作用域中拿到Context或Activity,或者需要统一的捕原创 2021-10-30 17:06:08 · 1989 阅读 · 0 评论 -
解决:The application could not be installed: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
一般这种情况,你都可以在清单文件顶部找到类似如下的代码:他的作用是:在AndroidManife.xml 中添加android:sharedUser可以将不同的程序加入到同一个进程中,方便数据的共享。但是有个前提是需要签名相同而报这个错有可能是因为签名和系统签名不相同, android.uid.system是表示系统进程解决方案1.如果是自己定制的系统可以使用系统签名,如果是上传到应用市场的,每个应用市场都不相同,所以可能就用不了2.如果不想和系统一个进程,就删掉这行代码扩.原创 2021-09-08 16:27:07 · 21451 阅读 · 3 评论 -
好用的Span(富文本)api
/** * 将一段文字中指定range的文字改变大小 * @param range 要改变大小的文字的范围 ps:你关注的${name}也关注了你哟 = 4..(name.length+4) * @param scale 缩放值,大于1,则比其他文字大;小于1,则比其他文字小;默认是1.5 * ps: https://mp.weixin.qq.com/s/ji9MRaMhpVM711lDYL0LFw * 文章里搜索TextAppearanceSpan,可以设置某一段的很多.原创 2021-08-31 22:28:14 · 283 阅读 · 0 评论 -
ViewModel优雅的弹加载窗和获取Context
前言目前安卓开发一般都是用的mvvm模式,Jetpack的ViewModel是必不可少的一部分,而vm的生命周期要比Activity和Fragment长的,所以其一般不推荐其直接持有A或F,因为可能会造成内存泄漏的问题,但是不传入,Context的获取和显示网络加载弹窗又成了问题.正文首先解决显示网络加载弹窗的问题,其有两种方案:1.使用MutableLiveData首先我们在BaseViewModel中加入弹窗的MutableLiveDataval dialogShow = Mu原创 2021-07-31 16:22:18 · 4222 阅读 · 0 评论 -
Gradle自动化之自动打包并上传到fir测试网站
前言原创 2021-06-03 15:54:59 · 537 阅读 · 6 评论 -
安卓动态.9图拉伸实现方案
前言最近公司要做自定义的聊天气泡,需要可以从服务器配置,并且有底图和边缘的动效边缘的动效到没什么难度,直接四个角对齐就好了但是从服务端配置的类似.9图可拉伸的效果就有点麻烦了所以下文尝试解决动态实现.9图思路首先做安卓开发的都知道.9图的特性:四个边有四条1像素的多余像素,用来表示可拉伸区域(左,上)和可展示内容的区域(右,下)(其实就是加了padding)最开始想着将一个服务端png转成.9特性的png,后来查了下发现项目内的.9图是会经过编译变成其他东西,所以此条pass原创 2021-03-26 16:12:24 · 2447 阅读 · 0 评论 -
Hook安卓项目内的字符串获取,用服务器的key value优先代替本地的key value
前言前段时间接到一个需求,要动态的增加多语言语种,且可以动态更新用户app上的不规范语言(比如一个英语过长导致按钮内显示不全)服务端的逻辑和前段动态获取的逻辑就不说了动态修改app内的语言参考这篇安卓多语言设置,深渊巨坑,适配7.0以上,并且解决因WebView产生的问题正文首先确定一下安卓中有几种获取字符串的方式1.Context#getResources().getString()2.Context#getString()//其实内部还是用的上一种方式,只不过少写了一点代码原创 2021-01-05 13:26:20 · 3572 阅读 · 13 评论 -
Kotlin协程在项目中的实际应用
前言本来我想写个协程三部曲,但是查了下貌似协程x的api和协程基础讲的比较多了,但是实战讲的很少,或者将实战也只是怎么用别人封装好的三方库对应的支持(retrofit,ViewModel,room等),这种还是只能算是对api的应用,如果让自己写一套,也是比较困难,于是直接写实战了ps:下面所说的协程专指Kotlin协程pps:本篇文章针对有协程基础api和协程x api有使用经验的童鞋ppps:有人说kt协程就是个线程切换框架(并且很多博客甚至也是这样写的?),但只能说ta并没有领悟到协程原创 2020-10-14 14:48:45 · 1410 阅读 · 0 评论 -
更新至Android Studio4.1后发现as打不开的解决方案
前言今天收到了as更新4.1推送,更完后发现打不开了,报下面的错误Internal error. Please refer to https://code.google.com/p/android/issuesjava.lang.NoSuchMethodError: com.intellij.ide.plugins.PluginManagerCore.loadDescriptors()[Lcom/intellij/ide/plugins/IdeaPluginDescriptorImpl;原创 2020-10-13 10:04:01 · 5999 阅读 · 40 评论 -
使用Retrofit时,对参数进行加密
前言从网上查了好多文章,不知道是不是版本问题,发现他们的都不管用,于是自己看了下源码,自己改了下源码import okhttp3.MediaTypeimport okhttp3.RequestBodyimport okhttp3.ResponseBodyimport retrofit2.Converterimport retrofit2.Retrofitimport java.lang.reflect.Type/** * creator: [email protected] *原创 2020-10-24 09:21:06 · 1181 阅读 · 0 评论 -
Intellij IDEA(Android Studio)好用的插件和软件
好插件有很多,合理利用插件可以提高开发效率,遇到好用的记录下,找到新的就更新1.Key Promoter Xidea的快捷键提醒和快速设置快捷键如果在idea上无法下载,则在官网下载:http://plugins.jetbrains.com/plugin/9792-key-promoter-x2.GsonFormat根据json串生成一个java类,很好用3.FindBug...原创 2018-07-23 17:51:43 · 13399 阅读 · 4 评论 -
接入Tinker热修复和踩坑
前言公司最近项目上线后总是遇见各种问题或bug,而我最近就一直在背黑锅,幸亏最近不用上Google Play了,赶紧加上热更新来脱离苦海吧,谁知道接入Tinker的过程中也踩了将近一周的坑,哎...一言难尽为什么选择Tinker我就对比了也懒得说了(其实是因为隔壁阿里收费)而且需要注意,中间很多版本不要使用最新的,要使用我写的,不然有问题了找都找不到(我在这中间查,试,测,中间用了不知道多长时间)正文此次接入Tinker是直接用的Tinker,没有使用Bugly的方式官方地址不多原创 2020-09-15 16:21:00 · 2035 阅读 · 2 评论 -
以回调形式使用startActivityForResult方法,并解决Activity被回收的问题
前言之前写过一篇文章写一个逻辑清晰的startActivityForResult(),拒绝来回扒拉代码,写了使用回调形式使用startActivityForResult方法,配合Kotlin的语法,可以很简单的处理startActivityForResult的返回数据和返回时机.ps:由于之前名字使用startActivityForResult会导致有时导错包,所以现在名字改成了jumpForResult问题(假设A页面启动B页面,下面简称A和B)但是也引出了一个问题,由于这个lam原创 2020-08-31 21:58:13 · 2464 阅读 · 2 评论 -
解决Android Studio内代码乱码
前言今天电脑忽然蓝屏了,重启后发现项目编译出现了些问题,然后打开某个文件发现代码乱码了,而且大部分文件都乱码了.解决方式在百度和Google上找了好多种方法,一般都是说设置编码就可以了,但是我用了他们的方法后并不起效.然后我删除build文件夹,清理as缓存都不起作用然后我把文件copy出来后发现用vscode就可以打开看到源码而不是乱码,再然后我发现只要把文件复制出来再覆盖回去,乱码问题就解决了...不知道为什么会这样,可能是as的bug吧,但是我没有深究下去为什么,以后有时间在看原创 2020-07-29 14:41:22 · 1039 阅读 · 2 评论 -
三方库报错真的就没有办法了吗?
前言项目最近适配了安卓10,而安卓10废弃了某些api,导致调用后就报错,比如:val var5: TelephonyManager = getSystemService("phone") as TelephonyManagervar5.deviceId而项目中用的某个库会在某些情况下调用该代码(这个库比较重要,更换的话问题比较多,且提问题的肯定赶不上上线了),于是就想办法能不能修改jar包来规避该问题然后试了下果然还是可以前提首先库是.jar或.aar的,不开源(开源的直接搞源原创 2020-05-30 14:54:03 · 271 阅读 · 0 评论 -
查看ndk崩溃
前言有一个项目,n多地方使用了ndk,但是之前没怎么搞过,遇到了几次崩溃,却无从下手,在百度上搜了良久,要么是重复的,要么是过时的,要么讲的不清楚自己试了不管用,于是科学搜索了下,并记录下来,怕自己再找不到了正文首先把ndk更新到最新版本(不要问我为什么...)下载安装好重启as,安不好就多安几次多重启几次然后配置ndk目录,一般ndk就在sdk子目录内然后配置环境...原创 2020-04-16 10:09:26 · 377 阅读 · 2 评论 -
模仿Retrofit封装一个使用更简单的网络请求框架
前言想封装一套网络请求,不想直接上来就用别人写好的,或者说对项目可以更好的掌控,所以自己模仿着Retrofit来写一套.想要有如下实现:1.快捷的网络请求调用2.声明式的定义网络请求函数3.可以很灵活的变更网络请求的方式(http,https,socket等)4.可以使用自己的线程池或者协程进行线程调度调用网络请求和接收返回数据:使用this或者:使用匿名内...原创 2020-03-26 16:37:06 · 767 阅读 · 0 评论 -
安卓修改动画效果--动画差值器TimeInterpolator
前一段时间让实现一个类似弹幕的效果,从右到左飘过去,时间八秒,嗯,很好做,一个动画就ok了布局代码:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width...原创 2019-10-21 15:39:19 · 412 阅读 · 1 评论 -
Kotlin优雅的使用sp(SharedPreferences)
前言我平时用java写的sp工具类,现在有两个需求:第一个是要管理sp的文件名,虽然java可以通过Config的方式配置几个final静态的字符串常量来管理,但是总感觉不够优雅,而且可能存在随便写个文件名,不放在Config内的情况第二个是要一次保存多个数据的话,java需要多次调用,emmm,不够优雅效果还是先看kt调用的代码同时向USER_INFO_CACHE文件中写...原创 2019-07-31 15:54:46 · 76602 阅读 · 1 评论 -
安卓多语言设置,深渊巨坑,适配7.0以上,并且解决因WebView产生的问题
前言安卓的多语言设置配置中strings.xml我就不说怎么弄了,主要说一下后续遇到的坑正文上个月接到需求,要给app内添加多语言设置,我心想没啥难的,配置一下strings.xml,加个修改的页面并保存到本地就ok了然后过了一阵,发现坑真多,然后我写了个工具类,如下:/** * creator: lt 2019/7/29--16:36 [email protected]...原创 2019-08-10 17:15:41 · 1345 阅读 · 2 评论 -
使用Glide进行预加载图片
废话不多说,直接上步骤1.Glide的预加载api是preload具体用法为:Glide3Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).preload(width, height)Glide4Glide.with(context).load(url).apply(Req...原创 2019-08-27 20:33:31 · 7522 阅读 · 5 评论 -
从0开始配置Flutter并运行demo
前言Flutter1.0正式版发布了,可以一份代码同时兼容Android,Ios,听说后面可能还会支持Web和pc貌似是以后的趋势,所以先来试一下,沾个脚印咳咳,针对Windows1.下载Fluter SDK官方下载地址:https://flutter.io/docs/get-started/install/windows不过需要科学上网,但是我下载好传到百度云盘了,网...原创 2018-12-14 17:31:51 · 427 阅读 · 1 评论 -
(二) LtRecyclerView v2.x (更多实用方法)
(一) 超简单自定义上下刷新布局-LtRecyclerView v2.x版本(基本使用)(二) LtRecyclerView v2.x (更多实用方法)(三) LtRecyclerView v2.x (自定义刷新View)1.设置上拉加载和下拉刷新和回调 rv.setOnUpAndDownListener(new OnUpAndDownListener(......原创 2018-06-13 12:33:05 · 285 阅读 · 1 评论 -
选择手机号前缀控件
前言前几天做了个选择控件,虽然挺简单的,但是就想给封装一下,封装完之后发现灵活性不高,牵扯资源比较多,于是就单拎出来,重新封装了下,灵活性大大提高,虽然很简单(源码就二百行,再加上一些xml文件和资源)Github地址:https://github.com/ltttttttttttt/select_countryps:kotlin写的,RecyclerView用的是v7包下的效果...原创 2019-08-19 11:30:22 · 9354 阅读 · 0 评论 -
安卓三方登录趟坑,QQ,微信,微博,Twitter,Facebook,Instagram
前言最近给app加入三方登录,由于比较多,所以就用的友盟统一登录,会比一个一个配置方便点正文先说QQ,微信,微博:国内QQ,微信,微博三方登录其实还行,并没有太多坑,文档也挺完善的.但是需要注意的就是你后台配置的签名和当前的签名是否一致,然后appid和appkey是否配置正确(比如粘贴的时候多粘了一个空格)Twitter,Facebook,Instagram:由于之前...原创 2019-09-02 15:03:13 · 7189 阅读 · 2 评论 -
Android Studio 点击运行总是debug
今天遇见个奇葩问题,Android studio一点击运行程序按钮,就会安装并进入debug模式,还巨卡后来发现,先把手机的开发者模式,关了再打开就行了,服了原创 2019-05-23 17:32:34 · 1852 阅读 · 3 评论 -
Android Studio 打包 V1 V2 签名
前言以前AS打包都是填完key信息就ok了,AS后面更新之后,打包的签名版本多了V1,V2选择,该如何选择呢?v1与v2的区别Android 7.0中引入了APK Signature Scheme v2,v1呢是jar Signature来自JDKV1:应该是通过ZIP条目进行验证,这样APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。V2:验证压缩文件的所有字节,而...转载 2018-07-06 11:23:11 · 1710 阅读 · 0 评论 -
安卓程序添加指纹解锁功能
前言指纹解锁技术成为当前验证用户信息的重要手段,基本上当前手机都配置了指纹解锁。当开发的APP需要加密验证时可以考虑添加系统指纹解锁功能。添加指纹解锁功能步骤很简单,大致过程如下:1 添加权限在Manifest.xml文件中添加访问用户指纹的权限。 <uses-permission android:name="android.permission.USE_FINGERP...转载 2018-07-06 10:21:09 · 1896 阅读 · 0 评论 -
安卓队列缓存文件,包括断点续传
想起来之前做视频缓存的工具类,没事记一下,中间用了一个开源的缓存的进度库,其他的都是自己写的其中网络请求时用的OkHttp3缓存进度库用的是: compile 'io.github.lizhangqu:coreprogress:1.0.2'封装的工具类:DownloadUtil.javaimport android.text.TextUtils;import an...原创 2018-07-12 16:35:49 · 785 阅读 · 2 评论 -
防止网络请求(或其他回调)引用,从而造成内存泄漏
本文的解决方案用来解决类似如:Activity请求网络,而回调传的是自身,造成Activity执行finish()后并没有被销毁,而是被网络请求持有.和其相类似的问题正文1.网络请求使用Activity当做回调,如:public class MainActivity extends BaseActivity implements ObserverCallBack { @Ov...原创 2018-07-04 14:28:06 · 2676 阅读 · 5 评论 -
Kotlin 中的 run、let、with、apply、also、takeIf、takeUnless 语法糖使用和原理分析
这些Kotlin的语法糖函数经常用,但也很容易搞混,所以转载一下,若混了可以回来再看转载自公众号:纸上浅谈 正文:在 Kotlin 有一些可以简化代码的语法糖,比如 run、let、with、apply、also、takeIf、takeUnless 等。再不明白这些语法糖的情况下去看 Kotlin 代码就会一脸懵逼,可当明白之后就会觉得原来可以这样简化。带接收者的函数字面...转载 2018-07-02 16:34:33 · 890 阅读 · 0 评论 -
(三) LtRecyclerView v2.x (自定义上拉和下拉刷新View)
(一) 超简单自定义上下刷新布局-LtRecyclerView v2.x版本(基本使用)(二) LtRecyclerView v2.x (更多实用方法)(三) LtRecyclerView v2.x (自定义刷新View)6.自定义上拉加载的View6.1.通过setUpLayoutId()方法传入一个id可以控制全局的上拉刷新View原理是通过显示和隐藏布局内的两个Vi......原创 2018-06-13 13:39:00 · 423 阅读 · 1 评论