泛型和委托
泛型定义泛型类 语法结构 123456//T代指泛型是一种约定俗成class MyClass<T> { fun method(param:T):T{ return param }} 调用 123val myClass=MyClass<Int>() val result=myClass.method(123) println(result) 定义泛型方法 语法结构 12345class MyClass{ fun<T>method(param:T):T{ return param }} 调用 123val myClass=MyClass() val result=myClass.method<Int>(123) println(result) 泛型上界对泛型类型进行限制 语法结构 12345class MyClass{ fun<T:Number>me...
Kotlin内置函数
内置函数 use 可以保证Lambda表达式中的所有代码执行完毕后自动将外层的流关闭,这样就不用再编写finally语句手动关闭了 forEachLine 它会将读取的每行内容回调到Lambda表达式,在lambda中完成拼接逻辑 arrayOf 用于便捷创建数组 by lazy 懒加载技术,可以先不执行,第一次调用时再执行其中的逻辑
探究ContentProvider(Kotlin)
运行时权限权限机制 分类 普通权限和危险权限(还包括一些特殊权限但使用不多,不参与讨论) 危险权限 特点 普通权限直接在AndroidManifest.xml中声明即可 危险权限需要进行运行时权限处理 原则上用户一旦同意某一个权限申请,同组的其它权限会自动授权,但不要基于此规则来实现任何逻辑功能 运行时申请权限1.在AndroidManifest.xml中声明权限 1<uses-permission android:name="android.permission.CALL_PHONE"/> 2.检查权限是否授权 123456if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { // 修正权限请求的字符串格式 ActivityCompat.requestPermissions(this, arrayO...
Kotlin高阶函数的应用
简化SharedPreferences的用法 通过扩展函数方式像其中添加open函数 接收函数类型 12345fun SharedPreferences.open(block:SharedPreferences.Editor.()->Unit){ val editor=edit() editor.block() editor.apply()} 123456//调用getSharedPreferences("data",Context.MODE_PRIVATE).open{ putString("name","Tom") putInt("age",19) putBoolean("married",false)} Android Studio自带扩展可以直接使用: 12345getSharedPreferences("data",Context.MODE_PRIVATE).edi...
数据存储(Kotlin)
文件存储存储数据 通过openFileOutput()得到FileOutputStream对象 借助它构建一个OutputStreamWriter对象在借助这个构建一个BufferedWriter对象 利用BufferedWriter将内容写入文件 1234567891011private fun save(inputText: String) { try { val output=openFileOutput("data",Context.MODE_PRIVATE) val writer=BufferedWriter(OutputStreamWriter(output)) writer.use{ it.write(inputText) } } catch (e: IOException) { e.printStackTrace() ...
Kotlin高阶函数
高阶函数函数类型(String,Int)->Unit 左边是函数接收参数类型,右边是返回值类型 定义含有函数类型的就叫高阶函数 实例1123456789101112131415161718fun num1Andnum2(num1:Int,num2:Int,operation: (Int,Int)->Int):Int{ val result=operation(num1,num2) return result}fun plus(num1:Int,num2:Int):Int{ return num1 + num2}fun minus(num1:Int,num2:Int):Int{ return num1-num2}fun main(){ val num1=100 val num2=50 val result1=num1Andnum2(num1,num2,::plus) val result2= num1Andnum2(num1,num2,::minus) ...
广播机制(Kotlin)
接收系统广播动态注册1234567891011121314151617181920212223242526272829303132333435class MainActivity : AppCompatActivity() { // 声明广播接收器变量 lateinit var timeChangeReceiver:TimeChangeReceiver // 声明视图绑定变量 private lateinit var binding:ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化视图绑定 binding=ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 创建IntentFilter并...
Kotlin扩展函数和运算符重载
扩展函数语法结构123fun ClassName.methodName(param1:Int,param2:Int):Int{return 0} 实例12345678910//构建扩展函数fun String.lettersCount():Int{ var count=0 for(char in this){ if(char.isLetter()){ count++ } } return count} 12345//调用fun main(){ val cnt="ABC123xyz!@#".lettersCount() println(cnt)} 运算符重载语法结构(可以实现同一个运算符多重重载)12345678910//重载class obj{ operator fun plus(obj:Obj):Obj{ //处理相加的逻辑 ...
碎片(Kotlin)
Fragment使用方式简单用法1.新建碎片布局 2.新建碎片类继承Fragment并在碎片类中动态加载碎片布局 3.将碎片引入活动布局 123456789101112//左碎片布局<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" and...
Kotlin延迟初始化和密封类
变量延迟初始化关键字lateinit 作用如果一个变量是全局变量且初始化在后面的过程中进行时该变量不得不赋值为null,但如果这样进行后面调用其任何方法都需要进行判空处理相对麻烦,所以这里可以使用延迟初始化,就不需要将其赋值为null了 注意使用延迟初始化时一定要保证后续某处对其完成了初始化 还可以通过代码进行判断是否完成了初始化 1234//::adapter.isInitialized表示已经初始化if(!::adapter.isInitialized){ adapter=MsgAdapter(msgList)} 密封类关键字sealed class 作用解决因语法原因导致的多余分支问题 实例123sealed class Resultclass Success(val msg:String):Result()class Failure(val error:Exception):Result() 1234fun getResultMsg(result:Result)=when(result){ is Success -> ...














