![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
文章平均质量分 61
懒惰史莱姆
这个作者很懒,什么都没留下…
展开
-
action actionMasked 区别
本文仅介绍 MotionEvent中 action actionMasked两者在使用上的区别相同点: 都表示此次MotionEvent的事件类型-手指按下/移动/抬起不同点: action 无法直接识别第二根手指的按下与抬起,而 actionMasked 可以。action 的类型有 按下、移动、抬起,而 actionMasked 有额外两种类型: ACTION_POINTER_DOWN - “已经有手指按着了,又按下了新手指” ACTION_P...原创 2020-12-14 16:11:18 · 2546 阅读 · 0 评论 -
集成bugly热后闪退 Unable to instantiate TinkerPatchReflectApplication. ClassNotFoundException Application
报错: java.lang.RuntimeException: Unable to instantiate application com.tencent.bugly.beta.tinker.TinkerPatchReflectApplication: java.lang.IllegalStateException: java.lang.ClassNotFoundExceptio...原创 2020-03-10 18:11:59 · 3842 阅读 · 3 评论 -
TextView 双下划线 / 下划线粗细不同 bug解决
解决方案:不要为 textView添加下划线 paintFlag,改用SpannableStringBuilder或Spanny为文字添加下划线,这样下划线会统一到文字底fontMetrics.descent位置为何有此问题?实测发现,直接为 TextPaint 添加 Paint.UNDERLINE_TEXT_FLAG 标记是有兼容问题的,当同一行文字中同时存在中文和 英文/...原创 2020-01-17 12:25:55 · 1305 阅读 · 0 评论 -
ConstraintLayout 高度错误。约束布局高度错误。当ConstraintLayout互相嵌套时,高度从撑满变成自适应
ConstraintLayout约束布局嵌套约束布局时,高度又计算错误了。错误情况如下:图中红色框部分是约束布局,紫色区域是设置了高度为match_parent的 View,但实际运行效果是 warp_content。当我把内部的约束布局换成非约束布局时(图2),效果正常了。我以前也发现过这个问题,但解决办法只是嵌套时不使用 ConstraintLayout ,这个方案一点都不...原创 2019-12-12 21:13:00 · 3110 阅读 · 0 评论 -
obtainStyledAttributes 使用方式
简单图解:图1、一个参数的 obtainStyledAttributes函数。图2、两个参数的obtainStyledAttributes函数图3、四个参数的obtainStyledAttributes函数测试代码:<!--提取Attrs方式Demo--><!--项目的Theme--><style name="TestBa...原创 2019-11-04 17:09:20 · 4597 阅读 · 0 评论 -
Handler 的核心 MessageQueue 动图
前言:最近学习Handler切换线程的源码,花了两天时间终于看懂了,发现原理非常简单,就是个人的理解能力太差,如果有一张动图,一看就能明白其原理,那该多好啊,于是花了一天时间学习PS制作了几张动图。吐槽下,PS只做动图是真的麻烦,很多操作不是想象的样子,和他一比,AndroidStudio真的良心。放图:—— 切换线程来执行方法的核心思想——调用Looper.loo...原创 2019-10-16 09:30:42 · 233 阅读 · 0 评论 -
修改默认Dialog样式
1、进入 App 的主样式处2、在主样式下添加这么一行来指定默认Dialog样式3、设置默认Dialog样式结束运行时,Dialog的构造函数会执行源码,不设置themeId时,去拿dialogThem作为默认的theme。但是要注意,古老的 Dialog 类测试后发现是无效的,使用普通的AppCompatDialog是有效的。...原创 2019-04-17 18:44:58 · 4580 阅读 · 0 评论 -
Android resource linking failed error: resource android:attr/dialogCornerRadius not found.
升级support依赖库到28后报错:Android resource linking failedC:\D\androidProject\Zaihupro-android\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values-v28\values-v28.xml:7: error: resourc...原创 2019-04-16 17:55:51 · 8842 阅读 · 6 评论 -
SynchronizedPool简述
SynchronizedPool类源码简单,5分钟即可看懂,此文仅节约4分钟看代码时间。简述:SynchronizedPool 是个对象缓存池,用法是val pool = Pools.SynchronizedPool<A>(10) // 创建容量为10的对象数组pool.release(A())//把 A 加入数组val a = pool.acquire()//从数组中...原创 2019-03-29 17:34:00 · 1095 阅读 · 0 评论 -
WebView延时加载url高度为 0
bug发现:有一个页面,使用 ScrollView 嵌套 WebView 和其它的一些视图展示,WebView 的 url 是从后台拿的,但我发现每次进入页面 WebView 的高度总为 0bug排查1、固定WebView高度可以正常显示2、不从后台拿url,直接给WebView指定固定url也可以显示3、等待一会儿后再给warp_content的WebView设置url,那么WebVi...原创 2019-02-13 14:50:13 · 1062 阅读 · 2 评论 -
设定Dialog宽高为何需要在Dialog.show()之后才有效
我在封装Dialog时想自己扩大Dialog宽度到屏幕大小,但无论设置View的宽度,布局的宽度还是Dialog.window的宽度都是无效的,百度后才发现需要在 dialog.show()之后再设置 dialog.window 宽度才有效,但是为什么必须在 show()之后呢? 我通过断点发现,在 dialog.show() 之前设置dialog.window的宽高会在 dialog.s...原创 2019-02-22 19:23:39 · 1416 阅读 · 0 评论 -
SVN、GIT。使用记录
代码管理器笔记介绍管理规范比较版本控制模式优缺点安装下载与安装GITSVN关联AndroidStudioSVNGIT查看查询远程版本库路径操作新建项目并加入版本管理SVNGIT添加忽略文件回滚上个版本(尤其重要,当你提交了错误代码时)坑介绍管理规范https://www.jianshu.com/p/71bede890a20比较版本控制模式SVN:集中式。GIT:分布式SVN服务器猿1...原创 2019-01-17 15:22:10 · 370 阅读 · 0 评论 -
Le蓝牙接入记录
LE蓝牙接入记录欢迎使用Markdown编辑器什么是LE蓝牙?多说无益,先让我看看Demo吧功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程...原创 2018-12-27 15:19:52 · 2841 阅读 · 0 评论 -
让 Button 大小适应背景图
修改方法:1、在主题中添加这样属性2、修改最小宽高为0dp需注意:古老的 Button 使用的是系统的buttonStyle,无法修改,而AppCompatButton使用的是自己的buttonStyle可以修改,所以如果是自定义的Button,需要继承AppCompatButton。解决的问题:有个很常见的需求,UI给了一张图,说这是个按钮,上面有文字显示。以前...原创 2019-04-18 16:30:42 · 3590 阅读 · 0 评论 -
个人解答:为什么源码中的断点行会错位
解答看底部 QA环节推理过程当我调试断点到源码时,很多时候断点行数都是错位的,网上说是因为 手机SDK 与 Studio的SDK 版本不一致。但是我写的、编译的、运行的都是v28的代码,怎么断点会跑到v26的代码中呢?再说了,假如我调用v28才出现的方法时,断点不可能走到v26中的,因为根本就没有那个方法。Android手机的Android版本无法升级,固定 v26,但是我估...原创 2019-04-28 18:28:54 · 702 阅读 · 0 评论 -
hdpi不用放图了
计算公式:分辨率斜线 = ( 分辨率长 * 分辨率长 + 分辨率宽 * 分辨率宽 ) 开方dpi(每英寸点数) = 分辨率斜线 / 物理斜线长度(英寸)1英寸 = 2.54厘米我的小米6: 2017/4上市,1920*1080,5.15英寸,dpi=427.74,density = 2.67。使用 xxhdpi测试机: 2016/4上市,1920*1080,5.5英寸,d...原创 2019-04-29 10:47:03 · 341 阅读 · 0 评论 -
从行情角度思考,啥是so文件
最近使用三方框架,需要导入so包,不知道应该哪个型号的,查了一堆感觉懵逼,直接记录下用以备忘。个人理解,若有不对,希望指正兼容方案:https://www.cnblogs.com/janehlp/p/7473240.html是什么: Java是有极限的,Java只在JVM虚拟机上做事,JVM无法直接操作系统,也没有提供系统API给Java开发者。 当Java无法完成任务,...原创 2019-06-27 21:14:06 · 160 阅读 · 0 评论 -
对 LiveData 的源码分析
Q: Activity 中使用 LiveData 时,是如何保证内存不泄漏的?A: 很简单,调用 LiveData.observe 来进行监听时,observe 方法内会添加一个 Activity.onDestroy 的监听。当 Activity.onDestroy 触发时,LiveData 会 detachObserver 清空所有观察者。Q: LiveData 的生命周期直到 Activ...原创 2019-09-17 15:35:56 · 153 阅读 · 0 评论 -
依赖 core-ktx 后报错 Failed resolution of: Landroidx/core/widget/TintableCompoundDrawablesView
运行时报错:继承AppCompatTextView时 - 无法访问TintableCompoundDrawablesView使用AppCompatTextView时 - Error inflating class androidx.appcompat.widget.AppCompatTextView使用TextView时 -Failed resolution of: Landroid...原创 2019-09-20 10:55:37 · 3990 阅读 · 1 评论 -
Android 线程间通信原理
此文章主涉及原理部分,需要已经懂得如何使用HandlerHandler众所周知,它是Android中切换线程的初始方案,可以大体分为: 主线程 -> 子线程 与 子线程 -> 主线程。《先讲一个基础的 主线程->子线程原理》使用Handler切换到子线程例子:thread {“开启线程,id:${Thread.currentThread().id}”.log()Loo...原创 2019-10-08 12:25:36 · 319 阅读 · 0 评论 -
ota / 固件更新 / 空中升级 接入记录
ota / 固件更新 / 空中升级 即 通过手机升级BLE蓝牙设备。固件更新最重要的就是参考 官方升级依赖库、与 官方使用Demo官方空中升级依赖库:https://github.com/NordicSemiconductor/Android-DFU-Library官方使用Demo:https://github.com/NordicSemiconductor/Android-nRF-...原创 2018-12-04 14:47:24 · 1157 阅读 · 0 评论 -
傻瓜式的解答:为什么原子运算 AtomicInteger 可以解决多线程计算临界资源错误
19-10-17 总结:对唯一的临界值 i 的操作只有一行代码:compareAndSet,我们只需要关心这行代码就能解决多线程计算问题,添加常量 current 是为了监听其它线程的干扰,一旦被干扰,current 就与 i 不同,通过 compareAndSet 就能知道已经被干扰了。compareAndSet 返回 true 意味着 i 还没有被其它线程干扰,并且已经成功操作 i,所以...原创 2018-11-15 16:10:49 · 344 阅读 · 0 评论 -
解决 导入三方时出现: appComponentFactory 错误
解决方案来源:https://blog.csdn.net/zxccxzzxz/article/details/82986956导入最新的三方某包后,清单文件报错:某包比如:implementation "com.github.hotchemi:permissionsdispatcher:4.0.0"Error: Attribute application@appCompo...原创 2018-11-08 15:25:18 · 72601 阅读 · 22 评论 -
RxJava concat 不往下走
非常简单的使用测试:Observable.<String>concat( Observable.<String>create(subscriber -> subscriber.onNext("1")), Observable.<String>create(subscriber -> subscriber.onNext(...原创 2018-07-02 16:32:34 · 1077 阅读 · 0 评论 -
错误:app 红叉,Please select Android SDK。已解决
锁定错误:在运行程序时出现这个问题。错误出现在修改 module 的 gradle 之后。但是我对 gradle 的修改只是添加一些内容,又把那些内容给删掉而已,并没有对gradle进行永久改变。如果回滚代码,则不会出现错误了分析:gradle没有改变仍然出错,所以这并不是 gradle 配置导致出现问题,而是 android Studio 的问题(打脸)解决尝试:1、在 Android SDK ...原创 2018-06-20 16:19:02 · 8227 阅读 · 8 评论 -
Notifacion 点击的逻辑思考
1、一定需要一个专门的 Notification 点击事件处理类,用于处理Notification点击后的逻辑。 单单一个点击Notification启动Activity没法解决大部分需求,因为需要在点击通知后进行各种逻辑判断:App是否已初始化、是否已在要启动的页面、通知是否已过期,这些都需要单独提取出来判断。2、点击通知的跳转页面语句在初始化成功后。 Notification事件类...原创 2018-06-25 19:32:32 · 162 阅读 · 0 评论 -
ConstraintSet 约束布局独有的 关键帧动画
关键帧动画:任何动画要表现运动或变化,至少前后要给出两个不同的关键状态,而中间状态的变化和衔接电脑可以自动完成,在Flash中,表示关键状态的帧动画叫做关键帧动画Constraint 可以配合 ConstraintLayout 实现关键帧动画,只需要给出 “动画前的xml”、“动画后的xml”、“插值器”就可以开始动画。val constraintSet1 = ConstraintSet(...原创 2018-06-01 17:55:39 · 2373 阅读 · 1 评论 -
讨厌的EventBus
前任留下的代码,大量使用了EventBus,注释很少,我非常头疼。1、难以追踪举个例子,类 A 使用 B 进行延时操作,A -> EventC -> B -> EventD -> A。类 A 使用 B 却不需要依赖 B,这样我要修改 B,却不知道 A 有用到 B,那就可能出现 BUG。退一步说,我可以通过事件 EventC 知道 A 与 B 有所关联,但可能还有 A1、A2...原创 2018-06-01 17:54:13 · 794 阅读 · 0 评论 -
思考- 为什么要使用MVP模式。答- 缩小文件,理清逻辑
我的第一个项目是使用的MVP模式,但当时还不太懂,让Presenter干了Model的事-加载数据,并不能说这么做是错的,因为是小公司,小项目,这样做更快,页面逻辑也清晰,所以还可以。第二个项目是外包公司的项目,老员工使用了MVC模式,加上了EvenBus传递数据。当不用定义繁杂的接口时,开发速度是更快的,两个接手的项目都是如此。我产生了疑问,“为什么要在项目中使用MVP模式,而不是开发更快的MV...原创 2018-06-12 18:09:47 · 1450 阅读 · 1 评论 -
lambda的坑
有如下代码//此方法被button2点击时触发fun onClickButton2() { val boolean = randomBoolean()//一个随机的boolean //使用一个唯一的监听 clickListener = clickListener ?: View.OnClickListener { MLog.w("$boolean") ...原创 2018-04-18 18:10:12 · 357 阅读 · 0 评论 -
pinyin4j 内存溢出
在写项目时遇到这么个需求:“使用拼音排序全国城市列表”那我当然是使用大名鼎鼎的pinyin4j排序了依赖的有 'com.belerweb:pinyin4j:2.5.1' 或 'com.github.obiteaaron:pinyin4j-multi:1.0.0'单当我打开城市列表页面时,Profier显示内存占用竟飙升了60M经过追踪,发现 Trie 这个类的内存没有被释放。而且持有它的竟然是 “...转载 2018-04-18 13:46:08 · 1155 阅读 · 0 评论 -
Android 关于 WeakRefresh的一个坑
WeakRefresh - 弱引用Android中经常为了防止内存泄露而使用HttpUtils -> WeakRefresh -> Activity内部类 -> Activity如此一来Activity的内存回收不会因为HttpUtils的工作未完成而失败。但有坑在这里:WeakRefresh -> Activity内部类。如果Activity内部类只有HttpUtils-...原创 2018-04-18 11:35:43 · 130 阅读 · 0 评论 -
RxJava 学习笔记 1 - 最简单的 create + subscribe
/* 首先,要知道英文单词的含义, observe(观察、说、注意到) observer(观察者) able(有能力的、能够) observable(可观察的事物、看得见的) subscribe(订阅)——常见于YouTube subscriber(订阅者)——点击subscribe,你就是youTuber的Subscriber了 onSubscribe(...原创 2018-07-02 17:08:02 · 613 阅读 · 0 评论 -
RxJava 学习笔记 2 - from(array)
fun start() { //解析 from - 多个 OnSubscribe(订阅回调) Observable.from(arrayOf(1, 2, 3, 4, 5)).subscribe { print(it) } /* 中心思想: 使用多态扩展了 OnSubscribe.call() 使其对 subscribe 的调用形式发生变化。 最终实现多次调用 ...原创 2018-07-02 17:19:12 · 1371 阅读 · 0 评论 -
导入Module错误 Manifest merger failed with multiple errors, see logs
项目A导入项目B的LibModule。1、直接导入会提示拒绝访问,我将LibModule拷贝一份后才导入到项目A中2、导入后,LibModule并没有正确的显示成Lib的样子,像是一个文件夹摆在那里,看了module下甚至有 gradle文件夹,各种尝试后,又重新导入了一边,这次 module 下没有 gralde 文件夹了。3、LibModule仍然不是Lib的样子,Project ...原创 2018-09-14 15:42:24 · 352 阅读 · 0 评论 -
简单的监听软键盘缩放的一种方式(不锁定 windowSoftInputMode==adjustPan 才可用)
要达到效果:当软键盘收起,隐藏EditTex控件。要求页面不能锁定软键盘适配模式为 adjustPan,否则此方案无效步骤:1、给外层ViewGoup添加 OnLayoutChangeListener 监听,这个监听会在软键盘展开/收起时触发。但仅仅这一步并不够,会发现触发总是又一次调用延迟2、给Activity设置 android:windowSoftInputMode="a...原创 2018-08-28 09:06:55 · 640 阅读 · 0 评论 -
ConstraintLayout 中扁平使用阴影的方案
由于 ConstraintLayout 的设计理念,尽量不要在布局中使用View嵌套,可是当View需要阴影,而Android版本又不够5.0时,该如何在不嵌套的情况下做出阴影的效果呢?答:将布局分层:背景层,内容层 两个View来绘制一个View。背景层使用ShadowLayout作为有阴影效果的背景,而内容层覆盖在背景层的上层展示View的内容。如此由于内容层背景是透明的,看...原创 2018-07-20 17:22:59 · 2701 阅读 · 0 评论 -
LiveData 理解笔记 - 抽象例子、自动移除 source、Observer 原理
抽象理解:LiveData链式编程 = 插板value 改变 = 自身发电,每个插板都能自身发电addSource = 让此插板通过转换器插上其它插板,这些插板并不能直接连接通电,甚至不能通电,必须在插板A发电时,由插板B的连接转换器设置为(是否随着A发电)addObserver = 让插板接上电器lifecycle = 电器,分为好坏状态,可以砸坏,但无法修好0、让一个插板连接...原创 2018-07-20 15:23:52 · 3758 阅读 · 0 评论 -
GoogleDemo 学习
最近在看google官方的一个小项目例子,这是 google 为 2018 大会时出的新框架 lifecycle、room、navigation、work 等出的一个项目例子。https://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample我看例子看着看着被 re...原创 2018-07-19 15:10:24 · 1073 阅读 · 0 评论 -
百度地图 Zoom 焦距程度记录
使用测试页面测试地图焦距效果:seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { val f = ...原创 2018-07-05 16:49:20 · 2677 阅读 · 0 评论