- 博客(50)
- 收藏
- 关注
原创 View 的滑动冲突
内部拦截法是指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就消耗掉,反之就交由父容器处理,这种方法和事件分发机制不一致,需要配合requestDisallowInterceptTouchEvent方法才能正常工作,使用起来较外部拦截法稍显复杂。,即不拦截ACTION_DOWN事件,这是因为父容器一旦拦截该事件,那么后续的ACTION_MOVE和ACTION_UP事件都会直接交由父容器处理,事件就无法传递给子元素了;事件,这个事件可以根据需要来决定是否拦截,如果父容器需要。...
2022-07-18 21:29:02
337
1
转载 Kotlin 泛型
Kotlin 中也有泛型的概念,和 Java 中的类似,但又不尽相同,一起来认识 Kotlin 中的泛型吧。一、基本使用通常我们会在类、接口、方法中声明泛型:1、泛型类class Animal<T> {}2、泛型接口interface IAnimal<T> {}3、泛型方法fun <T> initAnimal(param: T) {}二、泛型约束泛型约束表示我们可以指定泛型类型(T)的上界,即父类型,默认的上界为Any?,如果只有一个上界可以这样
2022-05-26 21:59:33
506
原创 Kotlin 高阶函数
高阶函数的定义: 如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数。如何定义一个函数类型:(String, Int) -> Unit ,->左边的部分就是用来声明该函数接收什么参数的,如果不接收任何参数写一对空括号就可以了。->右边的部分用于声明该函数的返回值是什么类型,如果没有返回值就使用 Unit,它大致。举个栗子: // 函数参数名 fun num1Andnum2(
2022-05-25 22:48:14
656
原创 Android - Navigation组件
Navigation 组件使用入门设置你的环境注意:Navigation 组件需要 Android Studio 3.3 或更高版本,并且依赖于 Java 8 语言功能。如需在您的项目中添加 Navigation 支持,请向应用的 build.gradle 文件添加以下依赖项:dependencies { def nav_version = "2.4.2" // Java language implementation implementation "androidx.navigat
2022-05-22 18:25:52
1024
原创 Android Jetpack - Databinding
DataBinding 是为了解除 Controller 与 ViewGroup 之间的引用联系DataBinding 库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。布局通常是使用调用界面框架方法的代码在 Activity 中定义的。例如,以下代码调用 findViewById() 来查找 TextView 微件并将其绑定到 viewModel 变量的 userName 属性:TextView textView = findViewById(R.
2022-05-19 23:40:45
313
原创 Android Jetpack - LiveData
LiveData 一般是和 ViewModel 结合起来使用的,比如计数器功能,在单线程模式下确实可以正常工作,但如果在 ViewModel 的内部开启了线程去执行一些耗时逻辑,那么在点击按钮后就我们想立即去获取最新的数据,但是得到的肯定还是之前的旧数据。**原本我们一直使用的都是在 Activity 中手动的获取 ViewModel 中的数据这种交互方式,但是 ViewModel 却无法将数据的变化主动地通知给 Activity。**那么怎么实现主动通知呢?或许你会说将 Activity 的实例传给 V
2022-05-15 22:44:59
362
原创 Android Jetpack - Lifecycle
Lifecycles是一个生命周期感知组件,当Activity或者Fragment的生命周期发生改变的时会,Lifecycles也会做出相应的生命周期状态的改变,它保存关于组件生命周期状态的信息(比如活动或片段),并允许其他对象观察这种状态。我们知道,当我们需要处理与生命周期相关的组件的时候,在没有Lifecycles提供的时候,需要设置各种回调,当组件数目过多的时候,便会需要在生命周期回调中管理多个组件从而徒增代码量,使得项目难以维护,而且在生命周期中执行过多的耗时操作极易引起内存泄漏,而这些都可以通过
2022-05-15 21:34:08
329
原创 Android Jetpack - ViewModel
在传统的开发模式下,Activity 的任务实在是太重了,既要负责逻辑处理,又要控制 UI 展示,甚至还要处理网络回调,等等。而 ViewModel 的一个重要作用就是可以帮助 Activity 分担一部分工作,它是专门用于存放于界面相关的数据的。也可以说,只要是界面上能看到的数据,它的相关变量都应该存放在ViewModel 中,而不是 Activity 中,这样可以在一定程度上减少 Activity 中的逻辑。当手机发生横竖屏旋转的时候,Activity 会被重新创建,同时存放在 Activity 中的
2022-05-15 20:20:13
156
原创 IntentFilter的匹配规则--艺术探索
启动 Activity 分为两种,显示调用和隐式调用。显示调用需要明确地指定被启动对象的组件信息,包括包名和类名。隐式调用需要 Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息,如果不匹配将无法启动 Activity。IntentFilter 中的过滤信息有 action、category、data。介绍各个属性的匹配规则:1.action 是一个字符串,系统预定义了一些 action,同时我们也可以在应用中定义自己的 action。action 的匹配要求 I
2022-02-11 18:00:21
1567
原创 启动模式--艺术探索
Activity 的 LaunchMode(启动模式)首先介绍一下 Activity 的默认启动模式:当我们多次启动同一个 Activity 的时候,系统会创建多个实例并把它们一一放入任务栈中,当我们单击 back键,会发现这些Activity会一一回退。(任务栈是一种 “先进后出” 的栈结构)每按一下 back 键就会有一个 Activity出栈,直到栈空为止,当栈中无任何 Activity 的时候,系统就会回收这个任务栈。当时这样也存在一定的弊端:当我们多次启动同一个 Activity
2022-02-10 22:33:39
1117
原创 Android--组件化开发
组件化概念为什么使用组件化?组件化基于可重用的目的,将应用拆分成多个独立组件,以减少耦合;通过关注点分离的形式,将Aoo分离成多个模块,每个模块都是一个组件。解决了各种业务代码耦合在一起导致的问题。开发的过程中,让这些组件被其他组件依赖,但是在调试时也可以成为独立的工程单独运行。多人开发中,每个组件模块有单人负责,降低了开发之间沟通的成本,减少因代码风格不一而产生的相互影响。什么是组件化?组件(Component),时对数据和方法的简单封装,功能单一,高类聚,并且是业务能划分的最小粒度。
2022-02-10 21:41:00
1045
原创 生命周期--艺术探索
正常情况的生命周期分析七大生命周期正常情况下 Activity 的常用生命周期就是上面7个,下面是各种生命周期的切换过程:上图分为以下几种情况:针对一个特定的 Activity ,第一次启动,回调如下:onCreate->onStart->onResume。当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop。这里有一种特殊情况,如果新Activity采用了透明主题,那么当前Activity不会回调 onStop 。当用户再次回到原
2022-01-30 20:53:11
1014
原创 git基础操作
1.1Git和代码托管中心代码托管中心的任务:维护远程库1.局域网环境下GitLab服务器2.外网环境下GitHub码云3.本地库与远程库团队内协作不同团队协作2.1本地库初始化命令:git init效果注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改2.2设置签名1.形式用户名:tomEmail 地址:goodMorning@atjiahui.com2.作用:区分不同开发人员的身份3.辨析:这里设置的签名和登录远程库
2022-01-07 20:43:47
335
原创 Android--Material Design
Material Design部分控件的使用<androidx.drawerlayout.widget.DrawerLayout 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" android:id="@+id/
2021-09-26 19:59:36
112
原创 Map集合
Map集合Map集合概述一.Map接口概述java.util包下的,使用时需要导包将键映射到值得对象一个映射不能包含重复的键每个键最多只能映射到一个值二.Map接口和Collection接口的不同Map是双列的,Collection是单列的Map的键唯一,Collection的子体系Set是唯一的Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效Map集合的功能概述1.添加功能V put(K key,V value):添加元素
2021-09-03 18:12:10
152
原创 java--集合总结
Collection一.List(存取有序,有索引,可以重复)1.ArrayList底层是数组实现的,线程不安全,查找和修改快,增删比较慢2.LinkedList底层是链表实现的,线程不安全,增删比较快,查找和修改比较慢3.Vector底层是数组实现的,线程安全,无论增删查改都慢如果查找和修改多,用ArrayList如果增删多用LinkedList如果都多用ArrayList二.Set(存取无序,无索引,不可以重复)1.HashSet底层是哈希算法实现,保证元素唯
2021-09-03 18:11:55
68
原创 异常&File类
异常异常的概述和分类一.异常的概述异常就是Java程序在运行过程中出现的错误二.异常的分类java.lang包下的使用时不需要导包Error服务器宕机,数据库崩溃等Exception三.异常的继承体系ThrowableErrorExceptionRuntimeExceptionJVM默认是如何处理异常的1.main函数接收到这个问题时,有两种处理方式:自己将该问题处理,然后继续运行自己没有针对的处理方式,只有交给调用main的jvm来处理2.jvm有一个默
2021-09-03 18:11:30
140
原创 IO流(字节流)
IO流IO流概述一.概念1.IO流用来处理设备之间的数据传输2.Java对数据的操作是通过流的方式3.Java用于操作流的类都在IO包中4.流按流向分为两种:输入流,输出流5.流按操作类型分为两种:字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的字符流:字符流只能操作纯字符数据,比较方便二.IO流常用父类1.字节流的抽象父类InputStreamOutputStream2.字符流的抽象父类ReaderWriter三.IO程序书写使
2021-09-03 18:11:17
177
原创 IO流(字符流)
IO流(字符流)字符流一.字符流是什么字符流是可以直接读取字符的IO流字符流读取字符,就要先读去到字节数据,然后转为字符,如果要写出字符,需要把字符转为字节再写出FileReaderFileReader类的read()方法可以按照字符大小读取import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class Demo1_FileReader
2021-09-03 18:11:06
502
原创 IO流(其他流)
其他流序列流一.什么是序列流序列流可以把多个字节输入流整合成一个,从序列流中读取数据时,将从整合的第一个流开始读,读完一个之后继续读第二个,以此类推二.使用方式整合两个输入流:SequenceInputstream(InputStream,InputStream)import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java
2021-09-03 18:10:48
77
原创 Set集合
Set集合Set集合概述Set集合与Collection集合中的方法一模一样HashSet一.概述HashSet实现Set接口,由哈希表支持。它不保证set的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用null二.HashSet存储字符串遍历import java.util.HashSet;public class Demo1_HashSet { public static void main(String[] args) { HashSet<String&g
2021-09-02 19:37:30
115
原创 java--集合
集合(Collection)集合的由来一.集合的由来数组长度是固定的,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,Java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少二.集合与数组的区别1.区别1:数组既可以存储基本数据类型,也可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象2.区别2:数组长
2021-09-02 19:36:17
87
原创 java工具类
工具类Arrays类的概述一.概述针对数组操作的工具类提供了排序查找等功能二.成员方法public static String toString(int[] a):将数组转换为字符串public static String toString(int[] a) { if (a == null) //如果传入的数组是null return "null"; //返
2021-09-02 19:35:49
41
原创 SringBuffer与StringBuilder类
SringBuffer类StringBuffer类的概述一.概述通过JDK提供的API,查看StringBuffer类的说明线程安全的可变字符序列二.StringBuffer和String的区别String是一个不可变的字符序列StringBuffer是一个可变的字符序列StringBuffer的构造成员方法一.StringBuffer的构造方法public StringBuffer():无参构造方法public StringBuffer(int capacity):指定容量
2021-09-02 19:35:29
96
原创 String类
String类Scanner的概述和方法介绍一.Scanner的概述一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器二.Scanner的构造方法原理Scanner(InputStrram source)System类下有一个静态的字段public static final InputStream in; 标准的输入流,对应着键盘输入三.一般方法hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等。如果需要判断是否包含下一个字符
2021-09-02 19:35:18
56
原创 Object类中的方法
Object类中的方法API(Application Programming Interface)1.API应用程序编程接口2.Java API就是Java提供给我们使用的类,这些类将底层的实现封装了起来我们不需要关心这些类是如何实现的,只需要学习这些类如何使用Object类1.Object类的概述类层次结构的根类所有类都直接或者间接的继承自该类2.构造方法public Object()子类的构造方法默认访问的是父类的无参构造方法HashCode()方法1方法声
2021-09-02 19:32:41
51
原创 java包
包3.导包(import)1.为什么要有import其实就是让有包的类对调用者可见,不用写全类名了2.导包格式import 包名;注意这种方式导入的是类的名称,虽然可以最后写*,但是不建议import java.util.*; //*代表通配符,他会到该包下挨个匹配,匹配上就会导入案例演示import package1.person; import package3.student;import java.util.Scanner; //在开发中我们用的都是导入
2021-09-02 19:32:17
123
原创 java类的继承
代码块1.普通代码块:类中方法的方法体(限定了变量的生命周期,出大括号就释放内存)2.构造代码块:构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行。3.静态代码块:用static{}包裹起来的代码片段,只会执行一次。静态代码块优先于构造代码块执行。4.同步代码块:使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。二.静态代码块和构造代码块的异同点相同点:都是
2021-09-02 19:31:37
423
原创 Android-解析JSON格式数据
使用JSONObject1.首先接收服务器返回的数据private void okHttpRequest() { new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client = new OkHttpClient(); Req
2021-08-30 19:53:17
495
原创 Android--OkHttp的使用
首先添加OkHttp库的依赖:implementation("com.squareup.okhttp3:okhttp:4.9.1")下面看一下OKHttp的具体用法:1.首先需要创建OKHttpClient的实例OkHttpClient client = new OkHttpClient();2.接着发送一条HTTP请求,就需要创建Request对象Request request = new Request.Builder().build();这是空的Request对象,并没有实际作用,
2021-08-23 20:30:45
226
原创 Android--通知的简单使用
通知的基本用法创建通知步骤:1.首先需要获取一个NotificationManager对象,用于管理通知,调用getSystemService()方法获取,此方法接收一个字符串参数用于确定获取系统的哪一个服务。NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);2.接着为通知创建一个通道NotificationChannel channel = ne
2021-08-21 20:17:27
971
原创 Android--运行时权限申请
以打电话为例子首先在AndroidManifest.xml文件中声明如下权限: <uses-permission android:name="android.permission.CALL_PHONE" />然后运行时申请权限public class RuntimePermissionTest extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState)
2021-08-21 18:08:07
658
2
原创 Android--LitePal数据库的使用
数据库存储之LitePalLitePal是一款开源的Android数据库框架,其采用了对象关系映射(ORM)的模式,并将平时开发最常用的一些数据库功能进行了封装,使得不用编写一行SQL语句也可以完成各种建表和CRUD操作。Github地址:https://github.com/LitePalFramework/LitePal一.配置数据库编辑build.gradle文件,在dependecies闭包中添加一下内容,其中的3.0.0为LitePal的版本,最新版本上LitePal的github上查看。
2021-08-20 18:49:14
374
原创 Android--实现数据持久化
文件存储核心代码:private void save() { String content = "hello world"; FileOutputStream out = null; BufferedWriter writer = null; try { out = openFileOutput("data", MODE_APPEND); writer = new BufferedWriter(new O
2021-08-20 17:27:05
205
原创 Android--广播的使用
接收系统广播动态注册监听网络变化首先需要创建一个广播接收器:新建类继承BroadcastReceiver,并重写onReceiver()方法。然后通过动态注册的方式编写一个能够监听网络变化的程序。最后申请权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />public class BroadcastTest extends AppCompatActivity { priv
2021-08-19 21:44:28
297
1
原创 Android--碎片的使用
碎片的基本用法在一个活动中添加两个碎片一.新建碎片布局左侧布局:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button
2021-08-19 18:05:07
203
原创 Android--聊天室客户端
简单介绍一下我的客户端效果展示添加依赖因为要用到LitePal数据库implementation 'org.litepal.guolindev:core:3.2.3'添加权限<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />1.登录界面登录
2021-08-19 15:35:51
114
原创 Android--聊天室服务端
服务端多人聊天和一对一聊天服务端将每个连接服务器的ip存入HashMap中,在聊天时匹配传入的ip。public class Server { private final static int PORT = 12345; public static HashMap<String,Socket> hm = new HashMap<>();//ip和socket套接字 public static void main(String[] args) throws I
2021-08-19 15:32:56
188
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人