自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

yechaoa

好记性不如烂笔头

  • 博客(346)
  • 资源 (2)
  • 收藏
  • 关注

原创 Android Studio Arctic Fox | 2020.3.1、Gradle 7.0升级记录

环境Android Studio Arctic Fox | 2020.3.1Gradle、AGP 7.0Kotlin 1.5.31问题1Value '/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home' given for org.gradle.java.home Gradle property is invalid (Java home supplied is invalid)解决Gradle的java环境变量

2021-09-25 16:06:48 3343

原创 【面经分享】5年Android开发的求职之路

前段时间在看机会,本文就是我对求职过程的一个总结。同时,也作为一个面试官,来说说求职中需要注意的点。

2021-08-15 15:12:13 5338 11

原创 【协程】ViewModelScope源码解析

推荐理由:1.自动取消,不会造成内存泄漏。2.配合ViewModel,能减少样板代码,提高效率。

2021-06-24 00:43:11 1524 1

原创 【协程】LifecycleScope源码解析

推荐理由:1.自动取消,不会造成内存泄漏,可以替代MainScope。2.可以基于指定的生命周期执行。

2021-06-22 00:50:28 3792 7

原创 Android ShapeableImageView使用详解,告别shape、三方库

效果前言先来看一下ShapeableImageView是什么由上图可以看到ShapeableImageView也没有什么神秘的,不过是ImageView的一个子类而已,但是从效果图来看,在不写shape、不引入三方库的情况下,还是挺容易实现预期效果的,而且扩展性良好。使用引入material包implementation 'com.google.android.material:material:1.2.1'常规<com.google.android.material.imag

2021-05-29 01:48:50 12319 14

原创 Android MaterialButton使用详解,告别shape、selector

按钮你还只用Button吗,试试MaterialButton吧。

2021-05-23 19:08:47 4209 12

原创 Android 自定义View之展开收起的Layout

效果分析效果图来看,点击事件触发view的展开收起,并在收起状态下保留了第一个子view显示,这个展开收起其实就是view的高度变化,所以只要控制好高度,就能很简单的实现这个效果。步骤1.初始化参数 设置方向等2.根据动画执行进度计算高度初始化class ExpandLinearLayout : LinearLayout { //是否展开,默认展开 private var isOpen = true //第一个子view的高度,即收起保留高度 priv

2021-02-18 17:13:06 4484 6

原创 Android 11适配指南之系统相机拍照、打开相册

前言适配前台程序员必不可少的工作之一,且可能要花大量的时间精力。何为前台程序员,是面向用户的一端,包括前端、移动端、PC等等。何为适配,适配就是当我们的开发环境、运行环境等发生变化的时候,程序依然能稳健运行。而适配中最难为程序员的就是Android了,除了开发环境、运行环境等因素之外,因为Android开源的原因,还要适配各大厂商。。而适配条件之多,经常让Android程序员为之头疼。来看看相机、相册相关的适配历程:Android 6 权限适配Android 7 文件适配Android

2021-01-28 17:33:25 11671 7

原创 Android 11适配指南之Toast解析

起源在targetSdkVersion为30的情况下,在Android 11的小米10的手机上运行,调用ToastUtil的时候闪退报错:null cannot be cast to non-null type android.widget.LinearLayout为什么说的这么详细呢,因为这些条件都是必须的:targetSdkVersion 30Android 11小米10同样的targetSdkVersion,在Android 11的华为P30 Pro上运行确实正常的,为什么呢,根据

2021-01-26 20:05:37 5978 3

原创 Android 自定义View之随机数验证码(仿写鸿洋)

前言本文面向自定义view新手,但是希望你最好有一定的理论知识,或基础概念,有的地方可能会一笔带过并不会细讲,细讲篇幅就太长了。本文仿写自鸿洋的自定义View (一),尽管过去了将近快7年之久,我觉得依然有学习价值。效果自定义View分类简单介绍一下自定义View分类:组合控件,继承自已有的layout,比如LinearLayout,然后通过LayoutInflater引入布局,然后处理相关事件,这种方式的好处在于,不需要过度关注view内部的绘制机制,而且扩展性也很强。继承自现有的系

2021-01-21 12:33:21 1034 1

原创 Jetpack之Room的使用,结合Flow

本文主要还是参考官方文档,然后以保存搜索历史为例操作一波。准备工作Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。依赖如需在应用中使用Room,请将以下依赖项添加到应用的 build.gradle文件。dependencies { def room_version = "2.2.5" implementation "androidx.room:room-runtime:$room_version" kapt.

2021-01-16 17:49:18 1193

原创 【解决问题的思路】its super classes have no public methods with the @Subscribe annotation

在打release包的时候遇到了这个问题,算是比较常见,记一下解决思路。本文介绍了出现这个问题的原因,以及出现问题时我的建议和我的思路,着急的可以直接看解决方案。异常Subscriber class xxx and its super classes have no public methods with the @Subscribe annotation遇到异常不要慌,其实已经提示的很明显了,指定了具体的class,且明确告诉你这个类没有@Subscribe注解。原因但其实知道了问题后,可能

2021-01-16 14:09:47 5847 2

原创 Android MediaPlayer音频播放器详解

效果音频播放,是比较常见或常用的功能,比如音乐播放器、新闻播报、听书等等,而恰巧如果你想自定义一个音频播放器的话,本文一定对你有帮助!常用方法start() 开始播放pause() 暂停播放stop() 停止播放prepare() 资源准备prepareAsync() 异步准备,不阻塞UI线程seekTo(int msec) 定位到指定位置,单位毫秒isLooping 是否循环播放isPlaying 播放状态duration 总时长currentPosition 当前位置rel

2021-01-06 20:48:32 5924 2

原创 Android 修改系统音量及监听

效果修改系统音量这种操作还是挺常见的,一般在多媒体开发中都多少会涉及到。常用方法获取音频管理器mAudioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager获取媒体音量最大值mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)获取系统当前媒体音量mCurrentVolume = mAudioManager.

2021-01-05 19:25:27 5732

原创 Android 修改系统屏幕亮度及监听

效果修改系统屏幕亮度这种操作还是挺常见的,一般在多媒体开发中都多少会涉及到。emmm 效果图好像看不出来变化。。不过不是很重要。。操作拆解上图中可以看到,分别有加减按钮和seekbar来控制亮度。后面会涉及到相关的事件。获取系统屏幕亮度 /** * 获取系统屏幕亮度(0-255) */ private fun getScreenBrightness(): Int { try { return Settings.Sy

2021-01-05 16:46:46 5913 5

原创 Android 硬布局item的高级写法

效果:这种布局应该是非常常见了,且写的比较多。今天简单探讨一下效果图中上下两种布局的写法。比较上下效果一致行数层级上部分1213下部分552下部分继续精简282可以看出,对比还是很明显的,精简到最后只有最开始的四分之一。上部分先看常规item写法,横向的LinearLayout嵌套三个子View,分别是左边的ImageView,中间的TextView,和右边的ImageView。然后每个横向的LinearLayout之间添加一个高

2020-12-21 19:37:52 5349 5

原创 Android 打开网页之CustomTabs

一般打开url有以下几种方式:调用默认浏览器用WebView用CustomTabsIntent默认浏览器的话,是跳转到别的app,我方app就切换到后台了,至于什么时候返回回来就不确定了,且在后台有被回收的风险,不利于业务开展,如果是打开浏览器之后就完成任务的情况,可以使用。WebView是我们比较常用的,如果页面可控,且需要交互的,还是建议使用webview的。CustomTabs在用户的默认浏览器中显示网页,相当于在自己的app中用默认浏览器打开网页,效果类似WebView,但使用起来比

2020-12-18 16:22:25 5855 6

原创 Android 阿里云镜像整理

在android开发中,因为各种原因,时常编译速度缓慢甚至卡住不动,切换到阿里云maven仓库之后,则可以提升编译速度。googlehttps://maven.aliyun.com/repository/googlejcenterhttps://maven.aliyun.com/repository/publicpublic(central仓和jcenter仓的聚合仓)https://maven.aliyun.com/repository/publicgradle-plugin

2020-12-18 14:30:17 2204 2

原创 BottomSheetDialog 使用详解,设置圆角、固定高度、默认全屏等

效果MD风格的底部弹窗,比自定义dialog或popupwindow使用更简单,功能也更强大。其实细分来说,是BottomSheet、BottomSheetDialog、BottomSheetDialogFragmentBottomSheet与主界面同层级关系,可以事件触发,如果有设置显示高度的话,也可以拉出来,且不会影响主界面的交互。XML<?xml version="1.0" encoding="utf-8"?><androidx.coordinatorlayout.

2020-11-25 20:14:30 29523 20

原创 TextView 代码设置最大长度之maxLength和maxEms

除了xml直接设置之外,可能会在动态添加TextView或自定义view的时候进行设置。maxLengthxmlandroid:maxLength="3"代码TextView.filters = arrayOf<InputFilter>(LengthFilter(3))这里会有一个问题,就是使用maxLength会让ellipsize设置失效android:ellipsize="end"上面的代码就没用了,但是还有另外一种方式maxEmsxmlandro

2020-11-21 15:22:40 4141

转载 Android SpannableString详细解析

文章目录什么是SpannableString?各种SpanForegroundColorSpan 前景色BackgroudColorSpan 背景色ClickableSpan 点击事件URLSpan 超链接MaskFilterSpan 模糊 浮雕RelativeSizeSpan 字体相对大小AbsoluteSizeSpan 字体绝对大小ScaleXSpan 字体x轴缩放StyleSpan 样式TypefaceSpan 字体TextAppearanceSpan 文字外貌UnderlineSpan 下划线Str

2020-10-29 15:32:13 1211

原创 Android 服务协议隐私政策高亮可点击写法

实现效果:亦或者是在弹窗中显示,都是一样的。代码比较简单: private fun setText() { //拼接字符串 val spanBuilder = SpannableStringBuilder("同意") /** * 服务协议 */ var span = SpannableString("服务协议") //服务协议点击事件 span.setSpan(

2020-10-24 19:38:09 3705 5

原创 Android 全埋点解决方案

本文参考《Android全埋点解决方案》一书,并在实操中查漏补缺。前言为什么选择全埋点呢,因为传统的手动埋点虽然简单、扩展性强,但弊端也很明显:开发时间成本较高改动的时间成本也较高容易出现漏埋、埋错的情况代码侵入性强但也不是说全埋点就一定没有弊端,比如扩展性较差。经过调研,实际上都是以全埋点为主、手动埋点为辅的情况,从而达到比较理想的埋点效果。本文内容可能稍微有点长,但是很简单,别太长不看啊,最后有demo源码。页面一般来说我们需要的数据就是,用户在哪个页面干了什么,也就是.

2020-10-21 20:42:19 2192

转载 比 Java 更强大的 kotlin.Deprecated

我们都知道 Java 有一个java.lang.Deprecated注解,用来将一个 API 标记为“废弃”,或者说“不建议使用”。比如 String 类就有一个被标记为 Deprecated的构造函数:@Deprecatedpublic String(byte ascii[], int hibyte) { this(ascii, hibyte, 0, ascii.length);}Java 还提供了一个 @deprecated 的文档标签,用于提供相关信息。这个注解存在几个缺陷:无

2020-10-19 16:19:05 1837

原创 Android Studio 4.0 提交项目到GitLab

常规操作,但是AS4.0有一些改动,且提交过程不是很顺畅,所以记录一下。git环境就不说了,自己配置1,先忽略文件有些文件不是公用的是可以不用上传的,还有一些是编译的文件也不用上传。AS4.0以前,忽略文件是可以在settings-version control里面可视化操作的,但是升级AS4.0之后,这个设置没有了,但是我们可以在根目录的.gitignore文件里添加。*.iml.gradle.idealocal.properties.DS_Store/build*/build

2020-10-10 16:48:34 1192

原创 Installation did not succeed。apk安装失败的一些解决办法

其实有挺多原因会导致安装失败的,所以解决办法也不尽相同,下面列举一些解决办法。一先查看手机环境,是否打开USB调试,是否允许安装应用,手机是否处于打开状态,黑屏状态下也是会安装失败的。二清除缓存并重启AS可以尝试同步重启手机。三重试安装,可能会在安装提示的时候点错了,导致安装失败。四删除.gradle文件夹、.idea文件夹,build文件夹。然后重新编译会自动生成,这个可能是因为升级了AS,或者改了某些配置导致的版本不对称,所以删除重新编译即可。五编译期间注意查看控制台中buil

2020-10-09 10:32:00 5259 7

原创 ‘annotationProcessor‘ dependencies won‘t be recognized as kapt annotation processors. Please change

‘annotationProcessor’ dependencies won’t be recognized as kapt annotation processors. Please change the configuration name to ‘kapt’ for these artifacts: ‘com.airbnb:deeplinkdispatch-processor:4.1.0’.简而言之,需要把annotationProcessor切换为kapt就可以了。切换前: api .

2020-10-08 16:04:02 4565 1

原创 DSL element ‘android.dataBinding.enabled‘ is obsolete and has been replaced with ‘android.buildFeatu

DSL element ‘android.dataBinding.enabled’ is obsolete and has been replaced with ‘android.buildFeatures.dataBinding’.It will be removed in version 5.0 of the Android Gradle plugin.实际上就是换一种写法。原来: dataBinding { enabled true }现在: bu.

2020-10-08 15:29:38 2832 1

原创 Android识别模拟器,判断是模拟器还是真机

文章目录前言原理禁止模拟器安装apk代码识别验证最后前言对于android开发者来说,模拟器是开发工具,但是对用户来说,可能就是薅羊毛、找漏洞的赚钱工具。不管是活动风控还是内容保护等等其他的出发点,应要求可能会要识别Android模拟器,甚至禁止模拟器登录或后续操作。今天做个简单的探讨。原理识别模拟器的原理,其实就是找出模拟器和真机的差别,但是这些差别体现在哪呢,比如运营商、手机卡、蓝牙、各种传感器等等。但是现在的模拟器也是越来越厉害了,可以模拟不同品牌的不同型号的不同版本的手机,而且有蓝牙、

2020-09-25 17:28:36 13160 3

原创 Android 复制文本到剪切板,及ClipboardManager相关操作

文章目录1.复制内容要剪切板2.清除剪切板3.获取剪切板内容这个功能也是很常见了,一般都是为了方便用户操作,比如复制订单编号。不废话,下面就来看看具体是怎么操作的。1.复制内容要剪切板tv_order_copy.setOnClickListener { //获取剪切板管理器 val cm: ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager //设

2020-07-02 11:52:32 3437

转载 谈工作和学习中,所谓的主动性

转载于公众号:caoz的梦呓1、好奇心对自己所从事的领域,应该持续保持好奇,比如程序执行效率的底层逻辑是什么,比如产品用户反馈的真实心理是什么,比如运营业务数据波动的背后真相是什么,好奇心才会驱动你去不断追问细节,不断提升自己的认知能力。2、责任心这是老板的产品,这是老板的公司,没错。这是我的产品,这是我的公司,也要有这个责任心,你说老板没有多给你钱,我一直用nba球星的例子来说话,底薪球员就不用努力表现么?你努力的目的是什么,是下一份合同!你表现得够好,下一份大合同,现在的老板可能会给,他不.

2020-05-31 23:51:37 775 1

转载 学习方法分享

特别声明:原作者 liuyubobobo由于每个人的背景不同,擅长不同,每个人都有适合自己的不同的学习方法;与此同时,不同的领域,由于其本质不同,学习方法也应该是不同的。我坚信:每个人去寻找适合于自己的学习方法,是每个人一生的话题。别人叙述的所谓的“学习方法”,只能作为参考用。1、不要完美主义!我观察到的大多数同学犯得最最最最大的“错误”,就是在学习上“完美主义”。乃至后续很多其他...

2020-04-16 17:33:59 1010

原创 Kotlin 协程总结

文章目录一、协程是什么1.简介2.协程好在哪3.协程具体怎么用a.添加依赖b.开始使用c.suspend4.小结二、挂起是什么1.「挂起」的本质线程:协程:2.怎么就「挂起」了?3.suspend 的意义?4.怎么自定义 suspend 函数?a.什么时候需要自定义 suspend 函数a.具体该怎么写5.小结三、挂起的非阻塞式是怎么回事1.什么是「非阻塞式挂起」2.为什么要讲非阻塞式挂起3.协程...

2020-04-03 19:13:55 1742 3

转载 Android 10 适配攻略

文章目录准备工作1.Scoped Storage(分区存储)说明适配补充2.权限变化1.在后台运行时访问设备位置信息需要权限2.一些电话、蓝牙和WLAN的API需要精确位置权限3.ACCESS_MEDIA_LOCATION4.PROCESS_OUTGOING_CALLS3.后台启动 Activity 的限制4.深色主题1.手动适配(资源替换)2.自动适配(Force Dark)手动切换主题监听深色...

2020-03-20 11:08:34 1277

转载 写一篇最好懂的HTTPS讲解

文章目录前言简述加密传统传输的问题对称加密非对称加密CA机构个人总结前言https这项技术现在已经应用得非常广泛了。随着苹果、Google等各大互联网领头企业纷纷在自己的操作系统、浏览器等主流产品中强制要求使用https,http的淘汰也正式进入了倒计时。其实https对于客户端开发人员来说并没有什么需要特别注意的地方,因为代码和写http请求时并没有什么两样。但也正是因为这个原因,导致许多...

2020-03-05 16:48:20 634 2

转载 全新的视图绑定工具 — ViewBinding 使用指南

前言我们在Android开发的过程中总是需要获取XML布局中的ViewId,以便给其赋值进行显示,早期我们只能使用 findViewById 这个API,会导致很多的模版代码出现。2013年左右Android界大神 Jake Wharton开源了Butter Knife框架,通过Bind(“viewid”)方式方便开发者获取ViewId。近两年由于谷歌对Kotlin的支持,我们开始使用 Andr...

2020-03-02 17:24:29 1740 5

原创 Android 模拟器不能连网?

前言Android 模拟器可以运行,但是不能连接网络,事实上这是第二次遇到这个情况了,第一次是在公司,Windows系统,当时的处理方式是直接禁用了IPV6,最近又遇到了,这次是mac系统,但是距离上次已经好久了,所有又耽搁了点时间解决,所以决定搞清楚并解决这个问题。出现异常首先最直接的就是会给你报异常:java.net.UnknownHostException: Unable to r...

2020-02-27 23:11:48 3254

转载 一个移动端开发者,对未来的思考

本文转载自微信订阅号:鸿洋,有启发,故转载。原作者:舒大飞,链接:https://juejin.im/post/5e0d85155188253a8b42e5ba平常都在写技术类文章,今天写篇作为一个移动端开发者对过去一年的总结和思考吧,既是对过去的回顾,也是对未来的思考。2019这一年对于我来说,当然最多的时间还是花在工作上。对于移动端开发来说,2019年依然是动荡的一年,各种跨平台技...

2020-01-19 11:12:37 941

原创 kotlin recycler_view must not be null

报错recycler_view must not be null解析找不到recycler_view? override fun initView() { recycler_view.layoutManager = LinearLayoutManager(mContext) }就上面这一行很简单的代码,居然提示找不到recycler_view,难道是ko...

2020-01-17 18:29:12 2733

原创 Kotlin BottomNavigationView添加角标(BadgeView)

效果思路获取整个BottomNavigationView菜单,再根据下标获取某一个子菜单tab,然后给这个tab添加我们自定义的view,可以是数字也可以是文字。代码 /** * 给BottomNavigationView 设置Badge 小红点 * * BottomNavigationMenuView中的每一个Tab是一个FrameLayout,...

2020-01-14 17:44:31 1849

so文件(全平台)so

so文件(全平台),so文件(全平台),so文件(全平台),so文件(全平台),so文件(全平台),so文件(全平台),

2020-08-13

代码版本控制工具

TortoiseSVN TortoiseGit

2016-12-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除