从零开始学习Kotlin

Kotlin初学(一:OnClickListener)

2019-08-29  本文已影响98人  我是还没达到3k的菜鸡

Kotlin都出来了好几年,火起来的时候也还没去学,今年想着学习下更好
对于Android开发来说,代码量精简了很多,extends被 : 代替,implement被 , 代替

class MainActivity : AppCompatActivity(), View.OnClickListener {

}

其他的一些变化和基本语法,在android项目中边学边看便用
现在讲讲Kotlin在android开发中OnClickListener的表现
重写的onClick中,以往java中的switch被when代替

 override fun onClick(v: View?) {
        when (v) {
            
        }
    }

case R.id.xx 被具体控件采用 xx -> 具体事件 代替

override fun onClick(v: View?) {
        when (v) {
            btn -> toast("点击了按钮")
        }
    }

其中btn的来源

//var 为变量,val常量,相当于final
private var btn: Button? = null

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btn = findViewById(R.id.main_btn)
        main_btn.setOnClickListener(this)
    }

toast采用的是Android增强库:Anko(添加依赖在末文)
toast包含两个方法:默认的短时长:toast()以及长时长:longToast()
对于toast函数,它在Anko库中的定义是:

//短时间显示
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
//长时间显示
fun Context.longToast(message: Int) = Toast.makeText(this, message, Toast.LENGTH_LONG).show()

在java的点击事件中,一个控件的点击监听中,可以处理多个事件,那么在Kotlin中该如何处理多个事件呢?
直接换行写肯定是不行的,在Kotlin中,控件的点击监听多个事件采用的就是:控件 -> {事件1;事件2}

override fun onClick(v: View?) {
        when (v) {
            //一个点击监听多个事件,采用 {xx;xx}形式
            //或者{xx
            //     xx}
            //回车键相当于';'
             btn -> {toast("点击了按钮");title?.text = origin.toInt().toString()}
//            btn -> {toast("点击了按钮")
//                title?.text = origin.toInt().toString()}
        }
    }

这个格式很熟悉吧
最后提出一个疑问:
既然控件的点击监听采用的是 控件-> 事件,对于同一个控件监听多个事件为什么不能采用如下方法:

override fun onClick(v: View?) {
        when (v) {
            //一个点击监听多个事件,采用 {xx;xx}形式
            btn -> toast("点击了按钮")
            btn -> title?.text = origin.toInt().toString()
        }
    }

这样的写法只会对第一个事件生效
求大佬解答

最后的运行结果图


Screenshot_1567072479.png Screenshot_1567072483.png

Anko依赖添加:
在项目的build.gradle的buildscript{添加Anko}

buildscript {
    ext.kotlin_version = '1.3.41'
    //Anko版本
    ext.anko_version = "0.9"
    repositories {
        google()
        jcenter()
        
    }

在app的build.gradle的dependencies{添加Anko}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    //anko库的编译配置
    implementation "org.jetbrains.anko:anko-common:$anko_version"
}

感谢各位的查看
在编程的道路越走越远

上一篇下一篇

猜你喜欢

热点阅读