- 博客(64)
- 资源 (2)
- 收藏
- 关注
原创 Kotlin 高阶函数[第一行代码 Kotlin 学习笔记]
高阶函数详解从本章的 Kotlin 课堂起,我们就将告别基础知识,开始转向 Kotlin 的高级用法,从而进一步提升你的 Kotlin 水平。那么就从高阶函数开始吧。定义高阶函数高阶函数和 Lambda 的关系是密不可分的。在第 2 章快速入门 Kotlin 编程的时候,我们已经学习了 Lambda 编程的基础知识,并且掌握了一些与集合相关的函数式 API 的用法,如 map、filter 函数等。另外,在第 3 章的 Kotlin 课堂中,我们又学习了 Kotlin 的标准函数,如 run、app
2021-07-26 11:27:50 331
原创 Kotlin 延迟初始化和密封类[第一行代码 Kotlin 学习笔记]
延迟初始化和密封类本节的 Kotlin 课堂,我们就来学习延迟初始化和密封类这两部分内容。对变量延长初始化前面我们已经学习了 Kotlin 语言的许多特性,包括变量不可变,变量不可为空,等等。这些特性都是为了尽可能地保证程序安全而设计的,但是有些时候这些特性也会在编码时给我们带来不少的麻烦。比如,如果你的类中存在很多全局变量实例,为了保证它们能够满足 Kotlin 的空指针检查语法标准,你不得不做许多的非空判断保护才行,即使你非常确定它们不会为空。下面我们通过一个具体的例子来看一下吧,就使用刚刚的
2021-07-24 21:40:28 268
原创 第一行代码第三版——第三章:探究 Activity
先从看得到的入手,探究 ActivityActivity 是什么Activity 是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。Activity 的基本用法在 Android Studio 中手动创建过 Activity;创建和加载布局;在 AndroidManifest 文件中注册;<!--主 Activity 的配置--><intent-filter> <action android:name="and
2021-07-23 17:47:45 396 1
原创 Kotlin 标准函数和静态方法[第一行代码 Kotlin 学习笔记]
标准函数和静态方法学完了 Kotlin 的基础知识而已,今天我们来学习 Kotlin 的标准函数和静态方法。标准函数 with、run 和 applyKotlin 的标准函数指的是 Standard.kt 文件中定义的函数,任何 Kotlin 代码都可以自由地调用所有的标准函数。在 快速入门 kotlin 编程 中,我们已经学习了 let 这个标准函数,它的主要作用就是配合 ?. 操作符来进行辅助判空处理,这里就不再赘述了。with 标准函数with 函数接收两个参数:第一个参数可以是一个任意类
2021-07-23 17:37:12 249 1
原创 快速入门 kotlin 编程[第一行代码 Kotlin 学习笔记]
快速入门 Kotlin 编程面向对象编程不同于面向过程的语言(比如 C 语言),面向对象的语言是可以创建类的。类就是对事物的一种封装。简单概括一下,就是将事物封装成具体的类,然后将事物所拥有的属性和能力分别定义成类中的字段和函数,接下来对类进行实例化,再根据具体的编程需求调用类中的字段和方法即可。类与对象class Person { var name = "" var age = 0 fun eat() { println(name + " is eating. He is "
2021-07-22 17:58:05 672 2
原创 Android 架构之 MVC 架构模式
前言由于 MVP、MVVM、组件化架构的兴起,MVC 架构在 android 中的应用变得越来越少,但 MVC 是基础,理解好 MVC 才能更好的理解 MVP,MVVM,因为后两种都是基于 MVC 发展而来的。有些人认为只要架构好 App 就做得好,这种认识其实是错误的,架构的本质一定是服务于业务的。每一种架构一定有它的优点和缺点,能适合自己的需求、提高开发效率的架构就是一个好的架构。例如一个功能相对比较简单并且后期也不再扩展的 App,完全可以用 MVC 架构来写,将逻辑全部写在 Activity
2021-06-21 18:34:07 794
原创 Android 使用 Kotlin 重写 Gradle 文件(Kotlin Gradle DSL)
概述众所周知,我们在 Android Studio 是使用 Gradle 来编译的,Gradle 是一种基于 Groovy 语言的构建工具,我们平时看到的 build.gradle 中的语法结构其实就是 Groovy 提供的 DSL 功能。DSL 的全称是领域特定语言(Domain Specific Language),它是编程语言赋予开发者的一种特殊能力,通过它我们可以编写出一些看似脱离其原始语法结构的代码,从而构建出一种专有的语法结构。毫无疑问,Kotlin 是支持 DSL 的,而且 Gradle
2021-06-16 17:08:34 875
原创 封装万能的 RecyclerView 适配器
传统的适配器在 Android 项目中,基本上都会有列表功能,而现在的列表功能都是通过 RecyclerView 实现的,当项目中列表功能比较多的时候,每一个 RecyclerView 都需要一个 Adapter 适配器,这样会使得项目中的 Adapter 类非常的多。所以,封装一个万能的 RecyclerView 适配器是可以提高我们的开发效率的。在这之前,我们先来看一下传统适配器配合 RecyclerView 是怎样使用的。我们先来看一下我们要实现的例子的样子,如下所示:适配器 Adapter
2021-06-10 11:49:24 723 2
原创 第一行代码第三版——第四章:UI 开发的点点滴滴
软件也要拼脸蛋,UI 开发的点点滴滴该如何编写程序界面在过去,Android 应用程序的界面主要是通过编写 XML 的方式来实现的。写 XML 的好处是,我们不仅能够了解界面背后的实现原理,而且编写出来的界面还可以具备很好的屏幕适配性。等你完全掌握了使用 XML 来编写界面的方法之后,不管是进行高复杂度的界面实现,还是分析和修改当前现有的界面,对你来说都将是手到擒来。不过最近几年,Google 又推出了一个全新的界面布局:ConstraintLayout。和以往传统的布局不同,ConstraintLa
2021-05-07 15:26:15 383 4
原创 复杂度分析[学习笔记]
复杂度分析我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?这里就要用到我们今天要讲的内容:时间、空间复杂度分析。其实,只要讲到数据结构与算法,就一定离不开时间、空间复杂度分析。所以复杂度分析是整个算法学习的精髓,只有掌握了它,才能掌握数据结构和算法。为什么需要复杂度分析?你可能会有些疑惑,我把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大
2021-04-15 16:02:45 356
原创 Kotlin 类型进阶
一、前言在 Kotlin 泛型(上) 中我们已经将 Kotlin 的 泛型基础 讲完了,想要学习泛型进阶,我们要先了解几个类。二、数据类 data class2.1、数据类的定义只需要在一个普通类的前面加一个 data,普通类就变成了数据类了,可以将它和 Java 的 JavaBean 做类比,如下:data class Book(val id: Long, val name: String, val author: Person)上面代码中定义在柱构造器中的属性又称为 component,可
2021-01-17 20:36:50 166
原创 Kotlin 泛型(上)
一、前言在 Kotlin 集合的变换与聚合 中我们已经将 Kotlin 的 集合变换与聚合 讲完了,今天我们来讲 Kotlin 的 SAM 转换。二、SAM 转换SAM 是(Single Abstract Method)的简写,我们将只有单一方法的接口称为 SAM 接口。2.1、Java 的 SAM 转换...
2021-01-16 20:32:13 414
原创 Kotlin 集合的变换与聚合
一、前言在 Kotlin 高阶函数与内联函数 中我们已经将 Kotlin 的 高阶函数 和 内联函数 讲完了,今天我们来讲 Kotlin 的 集合变换与聚合。二、集合变换与聚合2.1、集合的变换操作对于集合来说,最常见的使用方式就是对集合进行遍历,我们来看一下 Java 和 Kotlin 的遍历集合代码:Java:// 普通的 for 循环遍历for(int i = 0; i <= 10; i++) { System.out.println(i);}// for each 遍历
2021-01-15 21:56:34 791
原创 Kotlin 高阶函数与内联函数
一、前言在 Kotlin 学习笔记之内置类型(2)中我们已经将 Kotlin 函数的基本概念和基本用法讲完了,今天我们来讲函数进阶。二、高阶函数2.1、高阶函数概念高阶函数就是参数类型包含函数类型或者返回值类型是函数类型的函数,简单的说,高阶函数就是函数里面套函数,如下所示:// 参数类型是函数类型fun needsFunction(block: () -> Unit) { block()}// 返回值是函数类型fun returnsFunction(): () -> Lo
2021-01-14 21:55:23 285
原创 Kotlin 表达式与运算符
一、前言在 Kotlin 学习笔记之内置类型(1)和 Kotlin 学习笔记之内置类型(2)中我们已经讲了 Kotlin 内置类型中的基本类型、数组、区间、集合框架和函数。
2021-01-13 21:41:45 968
原创 Kotlin 空类型安全与智能类型转换
一、前言在 Kotlin 中的类与接口 中我们已经讲了 Kotlin 的 类、接口 和 扩展方法,今天我们来讲 Kotlin 中的 空类型安全 和 智能类型转换。二、Kotlin 空类型安全2.1、空类型安全概念Java 语言中是没有空类型安全这一概念的,所以写 Java 代码经常会出现空指针异常,但是 Kotlin 致力于消除空引用所带来的危险,所以就有了空类型安全概念。下面这段代码在 Kotlin 中是无法编译通过的,因为 Kotlin 的 String 是不能接受空值的,所以这个赋值操作是不
2021-01-12 21:10:20 252
原创 Kotlin 中的类与接口
一、前言在 Kotlin 学习笔记之内置类型(1)和 Kotlin 学习笔记之内置类型(2)中我们已经讲了 Kotlin 内置类型中的基本类型、数组、区间、集合框架和函数。二、Kotlin 中的类和接口2.1、类的定义Java:// 简单的类public class SimpleClass {}// 有属性和方法的类public class SimpleClass { public int x; public void y() { }}// 有构造方法的类public cl
2021-01-11 21:21:25 316
原创 Kotlin 学习笔记之内置类型(2)
一、前言在 Kotlin 学习笔记之内置类型(1) 中我们已经讲了 Kotlin 内置类型中的基本类型、数组和区间,今天我们来讲 Kotlin 的集合框架和函数。二、Kotlin 的集合框架Kotlin 的集合有以下特点:增加了 “不可变” 集合框架的接口;复用了 Java API 的所有实现类型;提供了丰富易用的方法,例如 forEach/map/flatMap。2.1、与 Java 对比Kotlin 中的集合分为可变与不可变,与 Java 的比较如下图所示:Kotlin
2021-01-04 22:28:01 275 1
原创 Kotlin 学习笔记之内置类型(1)
一、基本类型1.1、与 Java 对比我们来看一下 Kotlin 的基本类型与 Java 的区别,具体如下表所示:KotlinJava字节Bytebyte/Byte整型Int & Longint/Integer & long/Long浮点型Float & Doublefloat/Float & double/Double字符Charchar/Character字符串StringString1.2、声
2021-01-03 16:34:43 267 2
原创 插入排序
插入排序思路每次处理一个元素,把这个元素插入到前面已经排好序的牌中的合适位置。代码实现public class InsertionSort { private InsertionSort() {} // 插入排序 public static <E extends Comparable<E>> void sort(E[] arr) { for (int i = 0; i < arr.length; i++) {
2020-12-17 20:34:55 119
原创 选择排序
选择排序思路在需要排序的数据域中,先把最小的拿出来,放在合适的位置;剩下的,再把最小的拿出来,放在合适的位置;剩下的,再把最小的拿出来,放在合适的位置;…每次选择还没有处理的元素里最小的元素。注意选择排序是可以原地排序的,即不需要开辟额外的空间。代码实现public class SelectionSort { private SelectionSort() { } /** * 选择排序1(从头到尾遍历) * @param arr
2020-12-16 21:57:03 145
原创 Android 利用ViewPager开发引导页并加入帧动画、属性动画和音乐播放
一、前言现在很多 App 都有引导页,今天我们就利用 ViewPager 来实现引导页,并且在引导页中加入帧动画、属性动画和音乐播放等功能。二、最终效果展示
2020-11-19 11:43:48 228
原创 Java 多线程(二)——线程安全
一、前言多线程的实现方式 我们已经讲完了,今天我们来讲线程安全。二、线程安全2.1、线程安全概述如果有多个线程在同时运行,而这些线程可能会同时访问某一共享变量,这样就会产生线程安全问题。我们通过一个卖票案例来演示线程安全问题:public class RunnableImpl implements Runnable { // 定义一个多线程共享的票源 private int ticket = 100; // 卖票 @Override public vo
2020-11-16 21:01:37 97
原创 Android 小功能之 TextView 只设置某些文字可点击
一、效果展示我们先来看下效果:二、代码实现注释写的已经很详细了,其中tvLoginPrivacyPolicy是我需要设置对应地方有点击效果的TextView,具体代码实现如下所示:private void setTvLoginPrivacyPolicySpecialText() { // 不需要点击的文字 tvLoginPrivacyPolicy.setText(R.string.Bylogging); // 设置需要点击的文字 SpannableString click
2020-11-12 21:00:59 1143
原创 Java 多线程(一)——多线程的实现方式
一、前言Java 异常的处理方式与自定义异常 我们已经讲完了,从今天开始我们来学习多线程。二、多线程2.1、继承 Thread 类创建线程Java 使用 java.lang.Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码。Java 使用线程执行体来代表这段程序流。Java 中通过继承 Thread 类来创建并启动多线程的步骤如下:定义 Thread 类的子类,并重写该类的 run()
2020-11-11 20:34:09 155
原创 Java 异常的处理方式与自定义异常
一、前言Java 集合系列已经讲完了,接下来我们来讲异常与多线程。 Java 基础语法; 面向对象和封装; 常用 API 第一部分; 继承与多态; 常用 API 第二部分; 集合; 异常与多线程; File 类与 IO 流; 网络编程; JDK 8 新特性。二、异常2.1、异常概念异常指的是程序在执行过程中,出现的非正常的情况,最终会导致 JVM 的非正常停止。在 Java 等面向对象的编程语言中,异常本身是一个类,产生异常就会抛出了一个异常对象(比如说空指针异常)。Jav
2020-11-05 20:41:49 222
原创 Java 集合(四)——集合总结
一、前言Java 集合系列文章如下:Java 集合(一)——Collection集合接口、Iterator 迭代器和泛型;Java 集合(二)——List、Set集合和Collections工具类;Java 集合(三)——Map 集合;这篇文章主要对 Java 中的集合做一个简单的总结。二、集合(Collection)2.1、集合的由来我们需要容器来存储对象,而数组长度是固定的,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,语速 Java 就提供了集合类,能存储任意对象,长度
2020-11-01 21:26:44 180
原创 Java 集合(三)——Map 集合
一、前言集合按照其存储结构可以分为两大类,分别是单列集合 java.util.Collection 和双列集合 java.util.Map,单列集合我们在 Java 集合(一) 和 Java 集合(二)中已经讲了,今天我们来讲双列集合 Map 和一个综合案例。二、Map 集合2.1、Map 集合概述现实生活中,我们常会看到这样的一种集合:学生与学号,身份证号与个人,这种一一对应的关系,就叫做映射。Java 提供了专门的集合类用来存放这种对象关系,即 java.util.Map 接口。我们来看一下
2020-11-01 15:17:11 270 4
原创 Java 集合(二)——List、Set集合和Collections工具类
一、前言二、数据结构和集合相关的数据结包括:栈、队列、数组、链表和红黑树。2.1、栈栈是运算受限的线性表,其限制是仅允许在一端进行插入和删除操作。简单的说,采用该结构的集合,对元素的存取有如下的特点:先进后出;栈的入口、出口都在栈顶。2.2、队列队列同栈一样,也是一种运算受限的线性表,其限制是仅允许一端进行插入操作,另一端进行删除操作。简单来说,采用该结构的集合,对元素的存取有如下的特点:先进先出;队列的入口、出口各占一侧。2.3、数组数组是有序的元素序列,数组是在内存中开辟
2020-10-30 23:20:00 341
原创 Java 集合(一)——Collection集合接口、Iterator 迭代器和泛型
一、前言因为明年三四月份想换工作,也为了对 Java 语言有更深的理解,所以想重新学一遍 Java,把以前没有注意到的细节再巩固一下,因为现在时间还是有的,所以我决定重新的过一遍 Java 的知识点(至少比粗暴的刷 Java 面试题好)。我这里准备的学习资料主要有十大节,我们来看一下每节的目录(用的 Java 版本是目前用的最多的版本 Java 8):Java 基础语法;面向对象和封装;常用 API 第一部分;继承与多态;常用 API 第二部分;集合;异常与多线程;File 类与 IO
2020-10-28 19:42:18 269 2
原创 Android 子 View 的位置及坐标的获取方式详解
一、View1.1、View 概述视图 (View) 是一个容器,专门负责布局。表现为显示在屏幕上的各种视图,如 TextView、LinearLayout 等。1.2、View 分类View 主要分为两类,具体如下表格所示:类别示例特点单一视图即一个 View,如 TextView、EditText不包含子View视图组即多个 View 组成的 ViewGroup,如 RelativeLayout包含子View1.3、View 类简介View 类是
2020-10-27 14:24:13 527 2
原创 Android ORM框架 GreenDao 的使用详解
一、前言关于 Android 中常用的数据存储方式我们前面已经讲了 Sp 存储 和 文件存储,但是对于数据量比较大,并且结构复杂的数据我们想要存储只能通过数据库进行处理,Android 中提供了一个 SQLite 数据库,但是使用起来比较繁琐和复杂,所以 Android 又推出了 Room 持久性库,Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。但是我们今天不讲 Room 这个组件(以后讲 Jetpack
2020-10-23 20:51:18 961
原创 Android 外部存储与内部存储详解
一、前言在 Android 本地数据存储之 SharePreferences 存储 中,我们已经讲了 Sp 是如何保存数据的,并且也提供了一个 Sp 的工具类,今天我们来讲解一下 Android 中本地存储数据的另外一种方式——文件存储,文件存储又分为外部存储和内部存储。...
2020-10-20 21:35:04 801 1
原创 Android 本地数据存储之 SharePreferences 存储
一、前言数据的存储是我们在使用应用的过程中不可避免的操作,因为对于所有的应用而言我们主要的操作就是数据的读取与存储。二、Android 中常用的数据存储方式Android 中常用的数据存储方式有以下几种:SharePreferences 存储数据;文件存储(内部、外部);数据库存储(比如SQLite、greenDao、Room 等);ContentProvider 存储数据;网络存储数据(将数据存储在服务器端)。上面列出的五种存储方式里面,前面四种都属于本地数据存储方式,我们今天只讲
2020-10-18 17:17:32 1183
原创 Android RecyclerView 的使用详解
一、前言可以这样说,RecyclerView 的问世,替代了 ListView 和 GridView。RecyclerView 异常的灵活、可自定义并可重复利用的 Item 、高度的解耦,并且通过设置不同的 LayoutManager、ItemDecoration 和 ItemAnimator 可以实现令人瞠目的效果。ItemDecoration 的相关讲解大家可以看 这篇文章。源码已经上传至 github,地址在文末中已经给出,可以先下载到本地运行起来,因为具体事例讲解的时候并没有把全部的代码贴出来
2020-10-12 22:36:02 1216
原创 Fragment 实现简易新闻界面(适配手机与Pad)
一、前言Android 在 Android 3.0(API 级别 11)中引入了 Fragment,主要目的是为大屏幕(如平板电脑)上更加动态和灵活的界面设计提供支持。由于平板电脑的屏幕尺寸远胜于手机屏幕尺寸,因而有更多空间可供组合和交换界面组件。例如,新闻应用可以使用一个片段在左侧显示文章列表,使用另一个片段在右侧显示文章,两个片段并排显示在一个 Activity 中,每个片段都拥有自己的一套生命周期回调方法,并各自处理自己的用户输入事件。因此,用户无需使用一个 Activity 来选择文章,然后使用
2020-10-08 21:00:06 1798
原创 Fragment 与 Activity 的最佳通信方式
一、前言在 Fragment 与 Activity 之间的通信 这篇博客中,我们提了一下 Fragment 与 Activity 之间的最佳通信方式,但是我们没有深入的讲解,这篇博文我们就结合例子来讲一下这个知识。我们先来看一下我们今天的要做的实例的效果:这个实例就是一个 Activity 里面有两部分,这两部分分别加载了两个 Fragment,上面那个包含 EditText 的 Fragment 每次输入完数据后,按下回车键,要将数据在下面那个 ListFragment 里面展示出来,这就涉及到了
2020-10-06 22:15:50 342
原创 Fragment 与 Activity 之间的通信
一、前言在 Fragment 的创建、替换与移除 我们已经讲了 Fragment 的静态添加和动态添加,今天我们来讲 Fragment 的生命周期 和 Fragment 与 Activity 之间的交互。二、Fragment 的生命周期和 Activity 一样,Fragment 也有自己的生命周期,并且和 Activity 的生命周期非常相似。具体如下图所示:这里我们选择几个比较重要的状态来讲解一下:onAttach():当 Fragment 和 Activity 建立关联时调用;onCr
2020-10-05 21:52:38 950
原创 Fragment 的创建、替换与移除
一、Fragment 概述Fragment 是从 Android 3.0 开始引入的,翻译过来就是碎片的意思。Fragment 的作用以及使用场景我就不赘述了,我们直接来看 Fragment 是如何使用的。一、Fragment 的创建要使用 Fragment,可以通过继承 Fragment 类来创建 Fragment,在多数情况下我们需要给 Fragment 定制一个 UI,但是,也可以为 Activity 创建一个没有 UI,只提供后台行为的 Fragment。Fragment 的创建一般有两种
2020-10-03 22:22:59 611
原创 给 Android 开发者的 Kotlin 教程(三)
一、前言在 给 Android 开发者的 Kotlin 教程(二)中我们讲了 Kotlin 的必备基础,分别是 Kotlin 中的基本数据类型、数组以及集合这三大知识点。这一节我们来讲一下 Kotlin 中的方法和 Lambda 表达式这两个知识点。二、Kotlin 方法在 Java 中对象是最重要的,而在 Kotlin 中,方法才是最重要的,Kotlin 中方法是可以直接定义在文件里面的,不需要一定定义在类里面。2.1、方法声明Kotlin 中一个方法的基本格式如下所示:具体代码实现
2020-10-02 22:10:28 426
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人