美文网首页android实用技术Android知识Android开发
追风Kotlin系列第二滴血--不用findViewById()

追风Kotlin系列第二滴血--不用findViewById()

作者: 夏广成 | 来源:发表于2017-05-23 12:28 被阅读120次

    前面我们介绍了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不思议,突然的想念你

    相关文章

      网友评论

        本文标题:追风Kotlin系列第二滴血--不用findViewById()

        本文链接:https://www.haomeiwen.com/subject/bcxvxxtx.html