自定义View(一)
基本步骤自定义View的属性 format取值类型: 格式类型 含义说明 reference 资源引用,例如 @string/app_name、@drawable/icon string 字符串文本,例如 "Hello" integer 整数,例如 42 boolean 布尔值,例如 true、false color 颜色值,例如 #FF0000 或 @color/primary dimension 尺寸值,例如 16dp、12sp float 浮点数,例如 3.14 enum 枚举值(需配合 <enum> 使用) flag 位标志(可多选,需配合 <flag> 使用) 1234567891011<?xml version="1.0" encoding="utf-8"?><resources> <attr name="titleText" format="string" ...
高级技巧Kotlin
全局获取Context的技巧12345678910class MyApplication : Application() { companion object { @SuppressLint("StaticFieldLeak") lateinit var context: Context } override fun onCreate() { super.onCreate() context = applicationContext }} 12<application android:name=".MyApplication" /> 1Toast.makeText(MyApplication.context, "onCreate", Toast.LENGTH_SHORT).show() Intent传递对象Serializable方式 特点:Ser...
Kotlin使用DSL构建专有语法结构
DSL构建专有的语法结构DSL 是专为特定领域(如数据库查询、配置文件、UI布局等)设计的编程语言或语言的一个子集。Kotlin 提供了丰富的支持,帮助开发者用 Kotlin 代码构建出自己的 DSL 语言结构,以使得代码更加易读和易写。 扩展函数:你可以通过扩展函数给现有类添加自定义功能,从而实现新的语法结构。 高阶函数:Kotlin 允许将函数作为参数传递给其他函数,这使得定义和构建 DSL 成为可能。 Lambda 表达式:你可以通过 lambda 表达式使代码更加简洁,形成类似声明式的语法。 智能类型推断:这使得你无需显式声明类型,语法更清晰,推导更自然。 Lambda with Receiver(接收者 lambda)接收者 lambda 允许在 lambda 中访问外部对象的成员,而不需要显式的引用对象。通过这种方式,你可以通过一个语法块来访问和操作对象,类似于嵌套调用的结构。 1234567891011121314class DSL { fun sayHello() = println("Hello, World!")...
Jetpack(Kotlin)
JetpackJetpack全家福 ViewModel作用帮助Activity分担一部分工作,专门用于存放与界面相关的数据的,他可以保证在手机屏幕发生旋转时不会被重新创建,数据不会丢失 生命周期 用法 添加依赖 创建一个ViewModel类继承自ViewModel() 把界面相关的数据都放入其中 在Activity或fragment中创建其实例 构建相关逻辑 12implementation ("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2") // Kotlin 版本implementation ("androidx.lifecycle:lifecycle-viewmodel:2.6.2") // Java 版本 123class MainViewModel(countReserved: Int) : ViewModel() { var counter=0} 12345678910111213141516171819class MainActiv...
编写好用的工具
求N个数的最大最小值使用泛型实现Comparable接口,可以适用于任意类型数字比较 12345678910fun <T:Comparable<T>> max(vararg nums:T):T{ if(nums.isEmpty()) throw RuntimeException("Params can not be empty") var maxNum=nums[0] for(num in nums){ if(num>maxNum){ maxNum=num } } return maxNum} 简化Toast用法12345678//字符串调用fun String.showToast(context: Context,duration: Int=Toast.LENGTH_SHORT){ Toast.makeText(context,this,duration).show()&...
最美UI体验,Material Design(Kotlin)
各版块颜色的代表标识 Toolbar 在布局文件中使用 在活动中设置 12345678<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"//为弹出的菜单项设置主题 app:layout_scrollFlags="scroll|enterAlways|snap"/&...
Kotlin使用协程编写高效的并发程序
协程的基本用法 优点 协程允许我们在单线程模式下模拟多线程编程的效果 依赖库 1234// Gradle 依赖implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")//Android扩展implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0") Global.launch函数创建协程作用域 Global.launch创建的是一个顶层协程,这种协程当应用程序结束时也会跟着结束 使用Thread.sleep可以让主线程堵塞一定时长 delay()可以让当前协程延长指定时间后再运行,是一个非阻塞式的挂起函数,只会挂起当前协程,对其他线程或协程无影响 最大的问题就是可能代码还没运行结束应用程序就结束了,代码运行强制中断 123456GlobalScope.launch { println("codes run in coroutine sco...
网络技术(Kotlin)
WebView 使用WebView控件 调用getSettings方法设置浏览器属性 传入WebViewClient实例 传入网址 声明网络权限 1234<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"/> 123456789101112131415161718class MainActivity : AppCompatActivity() { private lateinit var binding:ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeT...
Kotlin泛型的高级特性
泛型的实化条件 内联函数 reified关键字修饰 举例 123inline fun <reified T> getGenericType(){ } 应用 启动活动 新建一个reified.kt文件 123456inline fun <reified T> startActivity(context:Context,block:Intent.()->Unit){ val intent= Intent(context,T::class.java) //高阶函数用于传递数据 intent.block() context.startActivity(intent)} 启动活动 1234startActivity<Test>(this){ putExtra("param1","data") putExtra("param2",123)...
Service(Kotlin)
多线程编程线程的四种形式 1234567class MyThread:Thread(){ override fun run(){ //编写具体逻辑 }}//启动MyThread.start() 12345678class MyThread:Runnable{ override fun run(){ //编写具体逻辑 }}//启动val myThread=MyThread()Thread(myThread).start() 123Thread{ //编写具体逻辑}.start() 123thread{ //编写具体逻辑} 最后一种是Kotlin内置的顶层函数,更加简单方便 在子线程中更新UI 定义一个整型变量表示更新UI的动作 新增一个Handler对象,重写父类handleMessage()方法,在这里对UI进行具体操作 开启子线程 创建Message对象 指定what字段值 调用sen...














