前些文章描述了 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技能小成相关推荐

  1. 计算机异常情况处理ppt,【计算机技能小课堂:Word/Excel/PPT电脑异常导致文件丢失,如何恢复?】- 环球网校...

    [摘要]大家周三好呀!各位环球网校的小伙伴们,新年快乐呀,2020大家要加油哦.今天这一期计算机技能小课堂:word技巧干货!Word Excel PPT电脑异常导致文件丢失,如何恢复.这个主题听起来 ...

  2. 小成开发日记-----利用Python在互动吧网站自动抢票实战分析

    作者:小成Charles 商业工作,学习交流请添加Vx:Lcc-Triumph 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/artic ...

  3. 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)

    作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...

  4. VIVO手机语音转文字怎么用?很多人都不知道在哪里,让小酱来教你

    VIVO手机语音转文字怎么用?很多人都不知道在哪里,让小酱来教你 很多使用VIVO手机的用户都会遇到一个困惑,不知道让自己心爱的手机如何进行语音转文字的操作,其实大家只是没有找到VIVO手机的语音转文 ...

  5. 同样25岁,为什么有的人事业小成,有的人却还一无所有?

    同样25岁,为什么有的人事业小成,有的人却还一无所有? 杨镝 开启故事模式~ 一 她今年 25 岁.家在乡镇农村,高中住宿,三年里的每个冬天穿的都是同一件淡黄色棉衣.学习很刻苦,高考成绩不错,去了一所 ...

  6. [蓝桥杯python] 秘密行动:小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面。这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层

     [蓝桥杯python] 秘密行动 1.资源限制 2.输入格式 3.输出格式 4.样式输入及输出 5.代码及解析 大功告成!编写不易,大家成功后点个关注or赞谢谢~ 问题描述 小D接到一项任务,要求他 ...

  7. 赚钱也好,投资也好,本质上都是一种专业技能

    赚钱也好,投资也好,本质上都是一种专业技能.赚钱,你需要理解市场需求,最快做出市场需求匹配的产品,然后用低成本的方式,扩大渠道获得收入. 投资,你需要判断价值和价格的落差,处理现金和资产的关系,并选对 ...

  8. 成功创业小成靠智,大成靠德

    成功创业小成靠智,大成靠德 更新时间:  2011-1-29   | 作者:  sunbus   | 来源:  阳光巴士创业网   | 阅读次数:  134 成功创业小成靠智,大成靠德.儒家云:做人要 ...

  9. 英雄联盟7月23日维修服务器,英雄联盟7月23日PBE版本更新 琴女技能小幅度重做...

    英雄联盟7月23日PBE版本更新 琴女技能小幅度重做 作者:逍遥时间:2021-07-23 分享到: 英雄联盟官方于2021年7月23日发布了PBE更新,在本次更新中添加了魔女系列的炫彩皮肤,对娑娜进 ...

最新文章

  1. AI删库,程序员背锅?
  2. shell编程系列7--shell中常用的工具find、locate、which、whereis
  3. XCTF(攻防世界)—进阶web题Write Up(二)
  4. 数据接口的登录态校验以及JWT
  5. SAP Spartacus Theme 设置
  6. Newton Method in Maching Learning
  7. java+解析占位符,如何告诉Spring使用Java映射来解析属性占位符?
  8. java提高篇四_(转)java提高篇(四)-----理解java的三大特性之多态
  9. MySql日期处理系列-常用的日期推算处理
  10. Java蓝桥杯--基础练习(7)特殊回文数
  11. 16进制String和int互转
  12. 《深入解析Windows操作系统第4版》随笔记录02
  13. 逻辑架构和物理架构在架构设计中的应用
  14. 新加坡 计算机专业,【新加坡计算机类专业】 - 环外新加坡留学网
  15. 禅道----产品经理创建项目集和产品线
  16. Codeforces1144C(C题)Two Shuffled Sequences
  17. vue直传图片到阿里云OSS(单张直接上传)
  18. H5+CSS+JS Tab导航栏自动切换
  19. 信用社计算机专业大纲,信用社计算机专业试题
  20. [Unity-经验]从购买云服务器到发布Unity WebGL项目

热门文章

  1. 拉卡拉智能POS终端常见的安全问题及设计要求
  2. 多方面看IP地址与常见的端口号~华山论剑
  3. 计算机技术对身体有益,对眼睛有益的7种食物,常看电脑和手机的你一定要多吃!...
  4. dsp31段最佳调音图_DSP调音技术~DSP功放31段EQ详解~DSP调音师推荐
  5. 参加“互联网+“比赛心得与体会
  6. c语言循环题兔子第三个月生,C语言·古典问题: 兔子总数
  7. TIN的构建、Delaunay三角网、Voronoi图
  8. Motivated Word (2)
  9. discuz网站没备案无执照接入支付宝充值功能
  10. cent os 安装