
android
文章平均质量分 75
苏木与晚风
不为往事扰,余生自愿笑。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Android Compose 自定义组件完全指南
本文介绍了Jetpack Compose中创建自定义组件的核心方法与实践。从基础概念入手,通过代码示例展示了简单组件、带参数组件、状态管理组件的实现方式,重点讲解了状态提升原则和组件间通信技巧。文章还分享了复杂组件的构建思路,强调通过合理拆分组件提升复用性,并提供了命名规范、参数设计、性能优化等最佳实践,帮助开发者构建高质量、可维护的Compose UI界面。原创 2025-07-29 10:01:25 · 453 阅读 · 0 评论 -
Jetpack Compose 无障碍(Accessibility)指南
本文介绍了在 Jetpack Compose 中实现无障碍功能的核心要点。首先强调了无障碍开发的重要性:法规合规需求、覆盖10%视觉障碍用户群体及提升产品可维护性。重点解析了 Compose 的无障碍架构,包括语义树、语义属性合并机制和服务生命周期。 主要内容包括:标准 Material 组件的无障碍支持、核心 API 使用(如 contentDescription、Modifier.semantics)、角色与状态定义、语义合并策略等。通过价格卡片...原创 2025-07-17 12:02:14 · 795 阅读 · 0 评论 -
Jetpack Compose 中 Kotlin 协程的使用
这篇文章系统介绍了Jetpack Compose中协程的使用方法和最佳实践。主要内容包括:协程在Compose中的必要性、作用域体系、专属API全景图、典型业务场景实战、生命周期管理、性能优化技巧和常见陷阱解决方案。文章通过对比不同作用域的生命周期,详细讲解了ViewModel层和UI层的协程使用,并提供了数据加载、Flow订阅、副作用处理等实用代码示例。最后强调了不可变数据、单一数据源等优化原则,帮助开发者编写高效稳定的Compose代码。原创 2025-07-16 17:58:34 · 997 阅读 · 0 评论 -
告别Hilt,拥抱简洁高效的依赖管理
本文提出了一种创新的Android架构设计——基于AppContainer的无Hilt方案,旨在解决传统DI框架的痛点。该架构通过AppContainer集中管理依赖,采用延迟初始化和单一职责原则,实现了简洁高效的依赖管理。核心包含AppContainer(依赖管理中心)、BaseViewModel(统一状态管理)和ViewModelFactory(Compose集成)三大组件。相比Hilt,该方案具有学习成本低、编译速度快、调试友好等优势,并通过实际案例展示了在登录功能中的完整实现流程。性能测试显示,该架原创 2025-07-15 14:27:05 · 681 阅读 · 0 评论 -
Android Jetpack Compose 状态管理介绍
本文全面介绍了Jetpack Compose的状态管理方案。首先解释了基础概念,通过电灯开关类比说明状态与UI更新的关系。然后详细对比了remember和rememberSaveable的区别,并分析了状态作用域问题。重点讲解了状态提升模式,通过购物车案例展示如何共享状态。对于复杂场景,介绍了ViewModel和StateHolder两种方案:ViewModel适合屏幕级业务逻辑,提供TodoList完整实现;StateHolder模式通过搜索功能案例演示了细粒度状态管理。最后给出项目结构建议和常见问题解决原创 2025-07-11 18:11:55 · 1156 阅读 · 0 评论 -
Android开发的华丽转身:从onActivityResult到ActivityResultLauncher的完美蜕变
ActivityResultLauncher是Android Jetpack引入的新API,用于替代传统的startActivityForResult(),解决了内存泄漏、代码分散和类型不安全等问题。它通过泛型提供类型安全,自动处理生命周期,将启动和回调逻辑集中管理。使用时需在Activity/Fragment中注册,支持图片选择、权限请求等常见场景。内置多种Contract如GetContent、TakePicture等,也支持自定义Contract。相比传统方式,ActivityResultLaunch原创 2025-07-04 14:16:03 · 841 阅读 · 0 评论 -
JetPack Compose 底部导航栏实现
---highlight: a11y-lighttheme: scrolls-light---开发一个新项目,底部导航栏一般是首页的标配,在以前的xml布局中,我们可以很轻松的是用谷歌提供的`BottomNavigationView`或者自定义来实现底部导航的功能,在Compose中也有也提供了一个类似的控件`androidx.compose.material.BottomNavigation`。#### 1.声明导航栏数据源主要声明导航栏label和图标数组,这里使用的是本地数据,也可以使用原创 2021-10-11 15:46:16 · 1766 阅读 · 0 评论 -
Jetpack Compose之布局介绍
Jetpack Compose 是用于构建原生界面的新款 Android 工具包。它可简化并加快 Android 上的界面开发。使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩。一.标准布局组件Compose中可以将多个控件元素组合使用,例如下面这样,@Composablefun WidgetGroup() { Text(text = "不为往事扰") Text(text = "余生只愿笑")}但是我们会发现,如果仅仅是这样,两个文本控件会重叠在一原创 2020-11-25 17:34:33 · 1153 阅读 · 1 评论 -
使用Activity Results API来替代onActivityResult
说到onActivityResult,我们已经非常熟悉来,通过在A activity启动B activity并且传入数据到B中,然后在A中通过onActivityResult来接收B中返回的数据。在最新的activity-ktx的beta版本中,谷歌已经废弃了onActivityResult。 @SuppressWarnings("deprecation") @Override @CallSuper protected void onActivityResult(int reque原创 2020-10-29 16:51:01 · 1586 阅读 · 0 评论 -
android中kotlin协程和线程的关系
一.子线程和主线程的频繁切换假设现在有这样的一个业务逻辑,有3个耗时操作,耗时1函数执行完毕后,我们需要调用函数1更新UI,再执行耗时2函数,执行完毕后我们在调用函数2更新UI,最后执行耗时3函数,再调用函数3更新UI。1.定义3个不同的耗时操作函数和3个更新UI的函数 fun ioCode1() { println("我是IO线程1==${Thread.currentThread().name}") } fun ioCode2() { prin原创 2020-09-23 17:56:00 · 2203 阅读 · 0 评论 -
使用属性动画ObjectAnimator来实现控件动画
前段时间,公司新开发的VR找房,需要用到一个标示VR房源的动画控件,效果图是下面这种动画效果:首先分析GIF图得知,这组动画又一个圆圈和上下两个扇形组成,通过改变扇形图片的透明度,和位移来实现动画效果。然后我们在布局中先定义3个ImageView来组合这个动画中的元素: <ImageView android:id="@+id/ivVrBorder" android:layout_width="60dp" android:layout_height原创 2020-08-22 00:07:48 · 936 阅读 · 0 评论 -
利用kotlin协程和retrofit2,LiveData,ViewModel实现一个简单的网络请求框架
今天我们利用LiveData,ViewModel,retrofit2,kotlin协程来搭建一个MVVM的网络请求框架,利用数据来驱动UI更新变化,将数据和UI进行分离。1.新建一个ApiService接口,由于我们常用的网络请求是get和post,所以这里利用retrofit定义这两张请求类型的公共方法,由于retrofit2中已经支持了对协程的支持,所以抽取的get和post方法如下:interface ApiService { @GET suspend fun <T>原创 2020-08-20 00:41:03 · 1972 阅读 · 1 评论 -
Flutter学习五之网络请求和轮播图的实现
上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢 官方使用的是dart io中的HttpClient发起的请求,但HttpClient本身功能较弱,很多常用功能都不支持。所以这里我们直接使用国内的开源库 dio,dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等功能。首先我们导入开源库dio,目前的最新版本是 dio: ^原创 2020-08-17 01:26:16 · 383 阅读 · 0 评论 -
Flutter学习三之搭建一个简单的项目框架
上一篇文章介绍了Dart的语法的基本使用,从这篇文章开始,开发一个基于玩Android网站的app。使用的他们开放的api来获取网站数据。根据网站的结构,我们app最外层框架需要添加一个底部导航栏,导航栏有5给tab,每个tab对应一个页面,分别是首页,项目,公众号,问答,我的等5个模块。在Android中,如果要实现这样的UI框架,有很多中实现方式,常用的就是一个Activity里面配合多个fragment来实现。但是在Flutter中并没有activity和fragment的组件。Flutter中原创 2020-08-13 14:36:23 · 577 阅读 · 0 评论 -
Flutter学习一之环境搭建
MacOS上搭建Flutter开发环境flutter官网下载最新的安装包,https://flutter.io/sdk-archive/#macos解压安装包到你想安装的目录。直接解压或者是用unzip命令打开mac终端,输入命令 open -e .bash_profile打开环境变量配置,在打开的文件中添加下面这段配置:export PATH=$PATH:/Users/caojing/flutter/flutter/bin export PATH=${PATH}:${ANDROID_HOM原创 2020-08-13 14:29:08 · 189 阅读 · 0 评论 -
仿淘宝首页功能菜单实现可动态配置的进度展示
最近新需求要我们将app首页的功能菜单,做成类似于淘宝首页功能菜单滑动进度展示的样子,同时要满足,首页功能菜单的栏位可以后台动态配置:每页展示的行数和列数,滑动进度类似于淘宝首页菜单的样子。通过观察可以发现,淘宝菜单进度条红线的宽度比上灰线的宽度等于屏幕的宽度比上菜单的总宽度。1.自定义底部进度条控件继承View,实现其构造方法。重写onDraw方法绘制两条横线,一条表示进度,一条表示要...原创 2019-11-15 11:13:44 · 1064 阅读 · 0 评论 -
关于两个Activity切换时生命周期的问题记录
前段时间做项目,有一个功能,需要从Aactivity(简称A)跳转到Bactivity(简称B), 需要在B finish的时候,保存一个字段到数据库中,然后在A 中的onResume()方法中根据这个字段来更新UI信息,开始的时候我直接在B的OnDestroy方法中保存字段,但是发现返回到A的时候,字段并没有改变,后来观察发现,B返回到A的时候,生命周期是下图这样的,并不是我一直认...原创 2018-03-25 16:44:59 · 378 阅读 · 0 评论 -
Glide一些不常用的用法记录
Glide是作为一个快速高效的Android图片加载库,几乎能满足日常对远程图片的拉取/缩放/显示的一切需求。使用起来也很方便,常见用法,也就一行代码就ok:Glide.with(this) .load(url) .placeholder(R.drawable.placeholder) .into(view);从 Glide 4.3.0 开始,可以为请求失败的图片url重新设置新...原创 2019-08-30 16:49:22 · 440 阅读 · 0 评论 -
Android利用BaseRecyclerViewAdapterHelper开源库实现多布局拖拽功能
最近项目需要一个多种类型图片之间的互相拖拽的效果,之前,由于是采用RecleView嵌套RecleView实现的,所以只能支持单个RecleView之间的相互拖拽,后来采用BaseRecyclerViewAdapterHelper开源库的多布局使用一个RecleView来实现不同类型的拖拽功能。类型是于下面这种布局,不同类型的图片可以互相拖拽:新建一个可以支持拖拽的adapter,继承自Bas...转载 2019-08-31 11:49:10 · 1654 阅读 · 1 评论 -
Android使用Jsoup来解析html
有时候可能我们会有这样的需求,拿到一个url链接,然后获取到里面的数据,再转换成原生来实现这个html页面。实现要解析html,应该和xml解析类似,先获取标签,再对标签里面的内容进行解析,一层层嵌套。Jsoup用法:1.在工程gradle中allprojects中加入下面这句话 maven { url "https://jsoup.org/" }2.在项目gradle中引入 ap...原创 2019-09-03 19:20:52 · 629 阅读 · 0 评论 -
Android WebView时重新加载导致页面刷新的问题
最近碰到一个需求,用WebView加载页面,选择了筛选条件之后,跳转到新的webVIew页面之后再返回,原来的筛选条件由于页面刷新导致已经清空,怎样才能解决返回的时候不去重新加载页面呢,网上很多答案是设置webView页面缓存,但是对部分h5页面还是没有效果。也有的博客说可以每次跳转到新的url的时候,可以addView 一个webView,返回的时候就回到上一个webView,这种方法是可行的...原创 2019-09-07 10:44:07 · 7576 阅读 · 0 评论 -
Activity禁用全局点击事件
android 事件分发机制是从Activity-ViewGroup-View,层层分发的,通过activtiy的dispatchTouchEvent方法分发到ViewGroup的dispatchTouchEvent,ViewGroup通过调用onInterceptTouchEvent方法来判断是否拦截事件,如果不拦截就继续分发到View中,然后遍历ViewGrop中所有子View找到我们点击的V...原创 2019-09-07 11:49:56 · 4141 阅读 · 0 评论 -
Kotlin扩展函数和属性
Kotlin 可以对一个类的属性和方法进行扩展,对被扩展的类代码本身不会造成任何影响。扩展函数可以为已经存在的类添加新的方法,并且不会修改原来的类。扩展函数由一下几个模块组成://Type:表示要扩展的类//functionName:表示扩展函数的方法名fun Type.functionName(){//扩展函数的逻辑}具体使用可以看下面的例子,我们定义一个String类的扩展...原创 2019-09-13 09:37:16 · 319 阅读 · 0 评论 -
时间戳转换
13位时间戳转10位时间戳去掉后三位,10位转13位时间戳后面补3个零例如:用java 转换10位时间戳:1363948516 在后面补充3个零Date date = new Date(Long.parseLong("1363948516000")); final SimpleDateFormat format = new SimpleDateFormat("yy原创 2015-06-29 13:56:19 · 643 阅读 · 0 评论