都掌握了吗?Kotlin技能小成
前些文章描述了 Kotlin教程,包括一些基本语法。
很多时候,还需要加以练习。
本文将开发过程中,遇到的点,整理成线,继而到面
希望 把下面的问题掌握之后,掌握Kotlin在Android中的开发能力
一眼望去,立刻知道答案,Kotlin小成
整理一下目录
1️⃣实现findViewById有几种方式?
进阶思考:Kotlin中的findViewById源码分析?
2️⃣根据状态改变初始值?
进阶思考:mCachedProfileBean未初始化就被访问会发生什么?
3️⃣怎么定义public static final 常量?
进阶思考①:伴生对象companion object适用范围,特点是什么?`
进阶思考②:const与val的区别?const相当于什么?跟@JvmField的效果比较
4️⃣?. 与!!.的区别是 什么
5️⃣lateinit标记的变量,若没初始化怎么处理?
6️⃣内部类的使用
7️⃣如何写一个instance函数
8️⃣集合的有哪些操作函数
9️⃣主构造函数什么时候需要显式的写?
进阶思考:初始化能否有多个init代码块?类的初始化顺序是怎么样的?
?注意this return break continue配合@label的使用
?1️⃣数据类怎么写
?2️⃣let、run、with、apply、also的速记整理
?3️⃣在kotlin中怎么进行运算:加减乘除余等
1️⃣实现findViewById有几种方式?
方法一:可以更低成本从java转kotlin
@BindView(R2.id.acco_refresh_layout)
lateinit var mSmartRefreshLayout: SmartRefreshLayout
沿用ButterKnifer,可以减少从Java转Kotin的代码转换工作量。
进阶思考:为什么用lateinit?不用行不行?
方法二:使用Kotlin自带的findViewById
import kotlinx.android.synthetic.main.这里是layout的xml名字.*acco_ll_service_info!!.visibility = View.GONE
Kotlin自带findViewById功能,acco_ll_service_info就是view在layout中的id。可以通过id直接访问。
进阶思考:Kotlin中的findViewById源码分析?
方法三:使用Android自带的findViewById
第一种写法,去掉泛型,在前面声明该控件的类型
var sml1 : SmartRefreshLayout = findViewById(R.id.acco_refresh_layout)第二种写法,在泛型中指定该控件类型
var sml2 = findViewById<SmartRefreshLayout>(R.id.acco_refresh_layout)
这两者写法得到的sml1和sml2是一样的
2️⃣根据状态改变初始值?
lateinit var mCachedProfileBean: UserInfoResponse.DataBeanprivate val tradePwdStatus: Stringget() = if (mCachedProfileBean?.tradePasswordStatus == UserInfoResponse.DataBean.TRADE_PWD_UN_SET) {"未设置"} else ""
val变量tradePwdStatus会根据mCachedProfileBean动态的改变 返回值
进阶思考:mCachedProfileBean未初始化就被访问会发生什么?
3️⃣怎么定义public static final 常量?
companion object {private const val MSG_EXIT_APP = 1
}
这里定义了int MSG_EXIT_APP。需要放在 companion object中。
进阶思考①:伴生对象companion object适用范围,特点是什么?
进阶思考②:const与val的区别?const相当于什么?跟@JvmField的效果比较
4️⃣?. 与!!.的区别是 什么
?.表示当前对象如果为空,则返回null。
fun main() {var numbers : List<String>?= nullprintln(numbers?.size?:999) //输出999
}
这个例子当numbers为null,则打印999,否则,输出numbers的size。
!!.表示当前对象为空,也继续该行语句的执行,然后会抛出NPE
fun main() {var numbers : List<String>?= nullprintln(numbers!!.size?:999) //输出999
}
这个范例:会抛出KotlinNullPointerException
5️⃣lateinit标记的变量,若没初始化怎么处理?
if (!this::mCachedProfileBean.isInitialized) {doSomething()return
}
mCachedProfileBean需要通过this::来进行引用。
如果这个判断在内部类。还需要指定this的引用对象
if (!this@SettingsActivity::mCachedProfileBean.isInitialized) {}
lateinit跟isInitialized是 配对出现的。
变量通过lateinit标记,有初始化,可以正常使用;
没有初始化,则通过isInitialized进行判断。
通过lateinit标记的变量,在使用的时候,就需要注意其初始化状态
private val tradePwdStatus: Stringget() = if (this::mCachedProfileBean.isInitialized&& mCachedProfileBean.tradePasswordStatus == UserInfoResponse.DataBean.TRADE_PWD_UN_SET) {"未设置"} else ""
没加this::mCachedProfileBean.isInitialized,IDE也不会提示什么。
万一,你一个不留神,就可能会抛出kotlin.UninitializedPropertyAccessException
6️⃣内部类的使用
private inner class MyHandler(activity: Activity) : Handler() {var mWeakReference: WeakReference<Activity> = WeakReference(activity)override fun handleMessage(msg: Message) {doSomething()finish()}
}
MyHandler继承自Handler,实现了handleMessage。
这里是通过inner来实现。假如我不用inner标记会如何?
inner内部类,隐式持有外部类的引用,可以访问外部类成员属性和成员函数。
若没有inner标记,则无法访问成员属性和成员函数。
在Kotlin的某个类中,写private class跟,新建了一个文件的效果是一样的。
7️⃣如何写一个instance函数
companion object {fun instance(): FundsOfflineRechargeFragment {return FundsOfflineRechargeFragment()}
}
调用方式:
FundsOfflineRechargeFragment.instance()
8️⃣集合的有哪些操作函数
集合有3种:List、Set、Map。整理了一下,主要是这些
- List:建、增、删、查、改、排序
建:listOf
增:add、addAll
删:removeAt
查:indexOf、lastIndexOf、indexOfFirst、indexOfLast、binarySearch、
改:set、fill
排序:sort、sortDescending、sortBy、sortByDescending、sortWith、shuffle、reverse - Set:建、合并、求同、取异
建:setOf
合并:union
求同:intersect
取异:subtract - Map:建、增、删、查、改、过滤
建:mapOf
增:plus(有改的效果)、+、put、putAll、plusAssign
删:minus(有改的效果)、-、remove
查:get、getOrElse、getOrDefault
改:put、putAll
过滤:filter
9️⃣主构造函数什么时候需要显式的写?
class ViewHolder internal constructor(itemView : View): RecyclerView.ViewHolder(itemView) {@BindView(R2.id.acco_iv_icon)lateinit var mIconIv : ImageView@BindView(R2.id.acco_tv_name)lateinit var mNameTv : TextViewinit {ButterKnife.bind(this, itemView)}
}
构造函数有注解或可见性修饰符。就需要显式的写。
初始化的代码需要放在init{}中
进阶思考:初始化能否有多个init代码块?类的初始化顺序是怎么样的?
private inner class MergeObservable(response1: BankCardListResponse, response2: UserAccountResponse) : Merge2Response<BankCardListResponse, UserAccountResponse>(response1, response2)
这里省略了 constructor
这是一个名为MergeObservable的内部类,有两个参数。
这相当于java的
private class MergeObservable extends Merge2Response<BankCardListResponse, UserAccountResponse> {public MergeObservable(BankCardListResponse response1, UserAccountResponse response2) {super(response1, response2);}
}
主构函数response1、response2代表了两个参数。
后面的<BankCardListResponse, UserAccountResponse>(response1, response2),都是给父类Merge2Response的。
泛型定义传了BankCardListResponse, UserAccountResponse
参数传了response1, response2
?注意this return break continue配合@label的使用
addNewBinder.setOnItemClickListener{holder, item, position ->if (mClientSn == 0) {requestInitInfo()return@setOnItemClickListener}val hasWritePermission = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTEDif (!hasWritePermission) {val rxPermissions = RxPermissions(this@AssetProofManageActivity)rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA).subscribe(Consumer<Boolean> { granted ->doSomething()})} else {getPhotoDialog().show()}}
标签label会引向特定的位置或对象。
?1️⃣数据类怎么写
data class QualifyInvestorBean(val index: Int, val icon: Int, val investorStatus: String, var dataManageType: String)
用data修饰class;
参数:标注var、val
类型:用符号:标注 类型
?2️⃣let、run、with、apply、also的速记整理
?3️⃣在kotlin中怎么进行运算:加减乘除余等
在Kotlin中,万物皆对象。在进行java、kotlin混编的时候,遇到尴尬
None of the following functions can be called with the arguments supplied.
原因:在运算中,kotlin不会自动转换这些数值的类型,而在java中使用是没有问题的,因为java会自动帮你转换。
所以,还是 类型声明
的问题。
拿截图中的范例来说,java应该是这样的
return * (1 - Integer.valueOf(findTransferRatio().getValue()).intValue() / 100.f) - (mResponseContent.getData().isDeduction() == 1 ? mResponseContent.getData().getAlreadyRepaidYieldBalance() : 0);
转换成kotlin
val quantity : Double = (mResponseContent?.data?.quantity?:0).toDouble()
val ratio : Double = 1 - (findTransferRatio()?.value?.toInt()?:0)/100.0
val alreadyYieldBalance : Double = if (mResponseContent?.data?.isDeduction == 1) mResponseContent?.data?.alreadyRepaidYieldBalance?:0.0 else 0.0return quantity * ratio - alreadyYieldBalance
类型转换问题,就需要手动更为精确的进行转换。
在kotlin中,对没个运算参数都需要确认格式。
本例中,这样拆分之后,就很清楚了
小结
是的~~~~
反射没写、。
嗯嗯嗯~~~~这些了这么多,因为IDE也会有warning提示。改掉之后就基本清晰了。
掌握了这些基本可以做业务开发
了。
欢迎大家帮忙补充~~~~
都掌握了吗?Kotlin技能小成相关推荐
- 计算机异常情况处理ppt,【计算机技能小课堂:Word/Excel/PPT电脑异常导致文件丢失,如何恢复?】- 环球网校...
[摘要]大家周三好呀!各位环球网校的小伙伴们,新年快乐呀,2020大家要加油哦.今天这一期计算机技能小课堂:word技巧干货!Word Excel PPT电脑异常导致文件丢失,如何恢复.这个主题听起来 ...
- 小成开发日记-----利用Python在互动吧网站自动抢票实战分析
作者:小成Charles 商业工作,学习交流请添加Vx:Lcc-Triumph 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/artic ...
- 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)
作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...
- VIVO手机语音转文字怎么用?很多人都不知道在哪里,让小酱来教你
VIVO手机语音转文字怎么用?很多人都不知道在哪里,让小酱来教你 很多使用VIVO手机的用户都会遇到一个困惑,不知道让自己心爱的手机如何进行语音转文字的操作,其实大家只是没有找到VIVO手机的语音转文 ...
- 同样25岁,为什么有的人事业小成,有的人却还一无所有?
同样25岁,为什么有的人事业小成,有的人却还一无所有? 杨镝 开启故事模式~ 一 她今年 25 岁.家在乡镇农村,高中住宿,三年里的每个冬天穿的都是同一件淡黄色棉衣.学习很刻苦,高考成绩不错,去了一所 ...
- [蓝桥杯python] 秘密行动:小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面。这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层
[蓝桥杯python] 秘密行动 1.资源限制 2.输入格式 3.输出格式 4.样式输入及输出 5.代码及解析 大功告成!编写不易,大家成功后点个关注or赞谢谢~ 问题描述 小D接到一项任务,要求他 ...
- 赚钱也好,投资也好,本质上都是一种专业技能
赚钱也好,投资也好,本质上都是一种专业技能.赚钱,你需要理解市场需求,最快做出市场需求匹配的产品,然后用低成本的方式,扩大渠道获得收入. 投资,你需要判断价值和价格的落差,处理现金和资产的关系,并选对 ...
- 成功创业小成靠智,大成靠德
成功创业小成靠智,大成靠德 更新时间: 2011-1-29 | 作者: sunbus | 来源: 阳光巴士创业网 | 阅读次数: 134 成功创业小成靠智,大成靠德.儒家云:做人要 ...
- 英雄联盟7月23日维修服务器,英雄联盟7月23日PBE版本更新 琴女技能小幅度重做...
英雄联盟7月23日PBE版本更新 琴女技能小幅度重做 作者:逍遥时间:2021-07-23 分享到: 英雄联盟官方于2021年7月23日发布了PBE更新,在本次更新中添加了魔女系列的炫彩皮肤,对娑娜进 ...
最新文章
- AI删库,程序员背锅?
- shell编程系列7--shell中常用的工具find、locate、which、whereis
- XCTF(攻防世界)—进阶web题Write Up(二)
- 数据接口的登录态校验以及JWT
- SAP Spartacus Theme 设置
- Newton Method in Maching Learning
- java+解析占位符,如何告诉Spring使用Java映射来解析属性占位符?
- java提高篇四_(转)java提高篇(四)-----理解java的三大特性之多态
- MySql日期处理系列-常用的日期推算处理
- Java蓝桥杯--基础练习(7)特殊回文数
- 16进制String和int互转
- 《深入解析Windows操作系统第4版》随笔记录02
- 逻辑架构和物理架构在架构设计中的应用
- 新加坡 计算机专业,【新加坡计算机类专业】 - 环外新加坡留学网
- 禅道----产品经理创建项目集和产品线
- Codeforces1144C(C题)Two Shuffled Sequences
- vue直传图片到阿里云OSS(单张直接上传)
- H5+CSS+JS Tab导航栏自动切换
- 信用社计算机专业大纲,信用社计算机专业试题
- [Unity-经验]从购买云服务器到发布Unity WebGL项目
热门文章
- 拉卡拉智能POS终端常见的安全问题及设计要求
- 多方面看IP地址与常见的端口号~华山论剑
- 计算机技术对身体有益,对眼睛有益的7种食物,常看电脑和手机的你一定要多吃!...
- dsp31段最佳调音图_DSP调音技术~DSP功放31段EQ详解~DSP调音师推荐
- 参加“互联网+“比赛心得与体会
- c语言循环题兔子第三个月生,C语言·古典问题: 兔子总数
- TIN的构建、Delaunay三角网、Voronoi图
- Motivated Word (2)
- discuz网站没备案无执照接入支付宝充值功能
- cent os 安装