Kotlin系列--不用findViewById()的Kotlin怎生书写?

前面我们介绍了Kotlin的基本用法,基本用法只是给我们展示了Kotlin最为简易,最为和善的一面。既然能够被Google钦点,那也说明Kotlin有其不平凡的伟大之处。下面依然是先介绍部分Kotlin知识,再练习一下Kotlin在Android中的使用,都是从官网学来的,强烈建议官网学习中文英文。文中若有理解失误之处,欢迎批评指正。

一:Kotlin习惯用法

(1):创建集合
在Kotlin的世界里,如果我们需要对象,那么基本上不再需要与new打照面了。var 我们在前面介绍中知道,她是可以定义变量和常量的一个关键字。比如定义一个整型的变量。

var a=5 //自动推倒,错了,应该是自动推导
var a:Int=5 //显示指定变量a为Int类型

同样,我们也可以用var来定义一个集合

var intList=listOf(-3,-2,-1,0,1,2,3)

这样我们就可以得到一个整型的集合。我们也可以

var strList=listOf("kot","lin")

生成一个字符串集合。同时我们还可以对这些集合进行过滤操作,比如

var tempList=intList.filter{it>1}

上面这个语句的意思是,在刚才生成的集合基础上,调用一个filter函数,该函数有个过滤作用,可以将数组中不满足条件的元素过滤掉,然后将满足条件的元素生成一个新的集合。其中的it不能更换为其他的阿猫阿狗,还有注意是花括号,这里是约定俗成的写法。这个语句的另一种写法是

var tempList=intList.filter{x->x>1}

看起来不明觉厉。其实我也不是很懂哈。


(2):给函数设定默认值

fun test(a:Int=6,b:String="love"){...}

(3):===和==区别
==比较真实的值,而===则比较内存地址,比如下面这样一个例子

var a=1000 //自动推导为Int类型
var tempA:Int?=a
var tempB:Int?=a
println(a===a)
println(tempA===tempB)
println(a==a)
println(tempA==tempB)

上面这个例子,将会分别输出true,false,true,true。因为自动装箱之后,数字不会保留同一性,但会保留相等性。


(4):数字的隐式转换消失,需要显示转换
由于Int 和Long是两种不同的类型,所以不能进行隐式转换,需要显示转换

var a=100;
var b:Long?=a //这样是错误的,编译无法通过

不仅这样,就算将一个Int类型的值和一个Long类型的值进行值的比较也不可以

var a:Int=1000 //自动推导为Int类型
var b:Long=2000
println(a==b) //编译会报错

用官网的一句话就是

同一性和相等性都会悄无声息地消失

那么怎么才能不报错呢?那就需要显示转换

  var a:Int=1000 //自动推导为Int类型
  var b:Long=2000
  println(a.toLong()==b)

每个数字有以下几种显示转换

toByte()
toShort()
toInt()
toLong()
toFloat()
toDouble()
toChar()

当然官网也给了我们一个计算的例子,用来表现隐式转换并没有完全消失不见

val a=2L+3 //Long+Int -->Long  

这里的变量a就被自动推导为Long类型

(5):创建数组

var strArray=arrayOf(1,2,4)
// 创建一个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })

(6):字符串
在kotlin中字符串分为转义字符串和原生字符串。转义字符串类似java中的字符串。原生字符串如下

   var strRaw="""abc

    bcd \n

|123
        |haha
"""
println(strRaw)

输出如下:

abc

    bcd \n

|123
        |haha

我们通过上面的输出可以看出来在原生字符串中,空格,换行,转义字符,都会原生保留下来。而至于转义字符串和java非常相似,相信大家都比较熟悉了。

二:离开了findViewById的Kotlin怎生书写?

前两天看一个Android-Kotlin开源项目PoiShuhui,项目是一个大二学生写的,顿时有一种被拍在岸上的感觉。看来活到老学到老非虚言也,现在的学生追技术,手速比我这老司机还块啊。打开项目一看,顿时傻眼了。这个FloatingActionButton没有findViewById啊,也没有什么注解,到底是为什么可以直接使用呢?

还好有官方文档,在Android扩展这一小节中,提到只要在build.gradle添加一个插件,就可以让我们摆脱掉findViewById的困扰。

image.png

不知道是不是我理解失误,明明说的是在项目的build.gradle中添加,我添加了然后没用,最后还是移到了app中的build.gradle中,插件才起作用。

apply plugin: 'kotlin-android-extensions'

activity:

import kotlinx.android.synthetic.main.activity_about.*

class AboutActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_about)
        webview.setWebViewClient(WebViewClient())
        webview.loadUrl("http://www.kangaiweishi.com")
    }
}

这样我们布局在layout中的webview的id就可以直接使用了。下面将Kotlin的传统写法也列出来

class AboutActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_about)
        var web=findViewById(R.id.webview) as WebView
        web.setWebViewClient(WebViewClient());
        web.loadUrl("http://www.kangaiweishi.com")
//        webview.setWebViewClient(WebViewClient())
//        webview.loadUrl("http://www.kangaiweishi.com")
    }
}

至于这个插件到底起到什么作用呢?官方文档是这么解释的

Kotlin Android Extensions is a plugin for the Kotlin compiler, and it does two things:
Adds a hidden caching function and a field inside each Kotlin Activity.
1:The method is pretty small so it doesn't increase the size of APK much.
2:Replaces each synthetic property call with a function call.

这个插件基本上不会增加apk的大小,所以尽管放心使用吧。

附录
追风Kotlin系列第一滴血--Kotlin不思议,突然的想念你

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容