Android

Kotlin空安全空类型浅谈

2022-06-21
目录 正文 一.判断可空变量是否为null的方式 二.涉及到返回可空值的函数使用方法,在返回类型后同时加? 三.let操作符 四.Evils操作符(?: !! as) 总结: 正文 首先非空变量和可空变量的区别: // name为不可为空的变量, 不能赋值为null ,若有判断 if(name==null) 无意义,因为肯定不为null var name : String = "" // role 为可空变量 var role : String? = "" 非空变量

Android开发Viewbinding委托实例详解

2022-06-21
目录 背景 从Crash到有意思的源码 有趣的代码 另外一些有意思的地方 结尾 背景 前一阵子我们在使用viewbinding的委托的时候碰到了点crash问题,然后发现了一个比较有意思的解决方案,就和大家展开聊聊. 另外一点就是我后面打算将kotlin extensions这个插件统一移除掉. 估计大家应该对Viewbinding的委托应该都有一定的了解,好几个大佬分享过类似的文章,但是大佬们的代码貌似也有一阵子都没有维护了,所以我找到了一个外国大佬写的仓库,其实应该算是一个相对来说比较稳定的

Android MonoRepo多仓和单仓的差别理论

2022-06-20
目录 前言 什么是Monorepo 什么是multi-repo multi-repo的问题 multi-repo的优点 MonoRepo的缺点 MonoRepo的优点 前言 今天不打算展开任何关于技术的探讨,只是想抛出一些观点,关于工程结构上的.可能有些人赞成也有些人反对,但是我觉得技术的世界还是需要一些讨论和探索的. 并没有指明那些就是最优解,可能都只是一些个人观点而已. 两种模式其实我都略微有点接触,当然文章也存粹是个人观点.我们先看下下面这幅图,其实就是一个原始工程结构,分仓结构,还有单仓

Kotlin实用语法糖空安全类型转换及相等性判断

2022-06-20
前言 Kotlin被Google官方认为是Android开发的一级编程语言.今天,我将主要讲解,关于Kotlin的一些实用语法糖,主要包括: 范围使用:in.downTo.step.until 类型检查 & 转换:is.智能转换.as 相等性:equals().== . === 空安全 1. 范围使用 主要用于表示范围,主要包括:in.downTo.step.until /** * 1. in * 作用:在...范围内 **/ // 表示:若i在1-5范围内,则执行下面代码 // 注:闭区间,[

Android自定义弹出框的方法

2022-06-20
在开发Android项目的过程中,弹出框真的是我们的常见的一种互动式窗体,但是Android系统自带的弹出框往往都不能满足我们的需要,大多数的时候需要我们自定义一种更漂亮的窗体来来展示给用户. 接下来是我很久之前用的一个自定义弹出框,记录一下,以便自己日后使用. 0.先来一张效果图 1.先定义个一个继承自Dialog的自定义弹框CustomDialog import android.app.Dialog; import android.content.Context; import androi

哔哩哔哩Android项目编译优化

2022-06-20
目录 背景 编译优化 工作流程 快编插件 获取工程树结构 version版本 源码orAAR 主动Skip模块 Configuration策略 远端upload R8 class check Faster 云编译 独立的编译单元 展望 结语 背景 哔哩哔哩的安卓项目的工程结构是Monorepo(单仓)变种,也就是所有的代码都在一个工程结构下编译.我们认为Monorepo(单仓)是一个非常适合我们的开发模式,主要是因为其提供的原子提交,可见性,参与度,切片的稳定性等等优点,这些都是我们选择Mono

Android开发gradle拉取依赖的加速配置

2022-06-20
目录 前言 情况1 : 情况2: 前言 镜像配置都是常规操作,必要时也可以上代理. 自己搭的nexus本质也是一种镜像,可以代理maven中央仓库. 各个仓库的测速,可以使用这个脚本: 通过测速,调整仓库的顺序 apply from: 'https://raw.githubusercontent.com/hss01248/flipperUtil/master/deps/depsLastestChecker.gradle' 情况1 : 每次点击sync project with gradle fi

Kotlin+buildSrc更好的管理Gadle依赖译文

2022-06-20
目录 前言 管理Gradle依赖的三种不同方法: 1) 手动管理 Google推荐:使用gradle的extra属性 Kotlin + buildSrc == Android Studio Autocomplete

Androd Gradle模块依赖替换使用技巧

2022-06-20
目录 背景 解决 步骤1: 步骤2: 步骤3: 背景 我们在多模块项目开发过程中,会遇到这样的场景,工程里依赖了一个自己的或者其他同事的 aar 模块,有时候为了开发调试方便,经常会把 aar 改为本地源码依赖,开发完毕并提交的时候,会再修改回 aar 依赖,这样就会很不方便,开发流程图示如下: 解决 一开始我们通过在 app 的 build.gradle 里的 dependency 判断如果是需要本地依赖的 aar,就替换为 implementation project 依赖,伪代码如下: d

Android基础入门之dataBinding的简单使用教程

2022-06-20
目录 前言 1.前期准备 1.1打开dataBinding 1.2修改布局文件 1.3修改Activity方法 2.DataBinding的使用 2.1属性更新 2.2<data>标签 2.2.1简单数据的定义与绑定 2.2.2复杂数据的定义与绑定 2.3事件绑定 2.3.1点击事件绑定 2.3.2点击事件回传数据 2.3.3动态改变对象数据在控件上显示 2.3.4动态改变基本数据在控件上显示 2.4与输入控件结合 2.5与图片控件结合 总结 前言 dataBinding是实现 view 和

Android自定义加载圈的方法

2022-06-20
本文实例为大家分享了Android自定义加载圈的具体代码,供大家参考,具体内容如下 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"

Kotlin1.6.20新功能Context&nbsp;Receivers使用技巧揭秘

2022-06-20
目录 前言 扩展函数的局限性 什么是 Context Receivers 如何使用 Context Receivers 引入 Context Receivers 导致可读性问题 Context Receivers 应用范围及注意事项 总结 前言 这篇文章我们一起来聊一下 Kotlin 1.6.20 的新功能 Context Receivers,来看看它为我们解决了什么问题. 通过这篇文章将会学习到以下内容: 扩展函数的局限性 什么是 Context Receivers,以及如何使用 Contex

Flutter实现不同缩放动画效果详解

2022-06-20
目录 需求背景 可缩放组件介绍 ScaleTransition SizeTransition AnimatedSize AnimatedBuilder 小结 需求背景 组件缩放可以向着一个方向进行缩放,放大列表中某一个Cell期望它是向后进行放大而非组件中心点开始缩放.具体效果如下图所示: 可缩放组件介绍 ScaleTransition ScaleTransition具体实现如下代码,设置AnimationController控制器若需要增加数值操作可以再增加Animate再调用forward方

Android实现启动引导图

2022-06-20
本文实例为大家分享了Android实现启动引导图的具体代码,供大家参考,具体内容如下 下面是安卓启动引导图的实现,话不多说,直接上代码. 1.布局文件:activity_guide.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     and

android viewpager实现轮播效果

2022-06-20
本文是基于ViewPager实现的无限自动轮播banner,供大家参考,具体内容如下 分为四步去实现: 第一步是有限手动轮播: 第二步是无限轮播: 第三步是自动轮播: 第四步是指示器适配 第一步:有限手动轮播实现 布局: <androidx.viewpager.widget.ViewPager     android:id="@+id/banner"     android:layout_width="match_parent"     android:lay

Android学习之BottomSheetDialog组件的使用

2022-06-20
目录 基本介绍 基础使用 其他功能实现 圆角样式实现 去弹窗外部遮罩阴影 关闭触发设置 列表视图使用 基本介绍 BottomSheetDialog是底部操作控件,可在屏幕底部创建一个支持滑动关闭视图. 目前依赖使用如下: implementation 'com.google.android.material:material:1.4.0' 基础使用 BottomSheetDialog需要为它添加视图内容,类似Dialog,且BottomSheetDialog的高度由自定义视图决定. var te

哔哩哔哩在Hilt组件化的使用技术探索

2022-06-19
目录 前言 接入Hilt Hilt在组件化 出现了点小问题 总结 前言 DI(Dependency Injection),即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中.依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活.可扩展的平台.通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现. 最近业务同学需要接入

Gradle&nbsp;Build&nbsp;Cache引发的Task缓存编译问题

2022-06-19
目录 前言 基础知识 Cacheable tasks TaskOutput 有趣的编译问题 问题分析 最后 前言 前一阵子公司内部卷了一篇文章大家有兴趣的可以看下,大概把我们编译优化的原理介绍了下,当然其中还有些技术细节相关的并没有写. 哔哩哔哩Android编译优化. 基础知识 Gradle 构建缓存是一种缓存机制,旨在通过重用其他构建产生的输出来节省时间.构建缓存通过存储(本地或远程)构建输出并允许构建在确定输入没有更改时从缓存中获取这些输出来工作,从而避免了重新生成它们的昂贵工作. 使用构

Android实现加载圈

2022-06-19
开发过程中经常用到加载圈,特别是车机开发由于外设不同很多操作响应的等待时长经常要用到不同的加载圈. 首先,直接上菊花效果图,这是我直接从项目里面截取下来的. 核心代码 import android.app.Dialog; import android.content.Context; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.v

Android实现显示和隐藏密码功能的示例代码

2022-06-19
在前端中我们知道用javascript就可以可以很容易实现,那么在Android中怎么实现这个功能呢? Java代码 package com.example.test2; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.text.method.HideReturnsTransformationMethod; import android.text.method.Pa