kotlin简单项目



对本文有任何问题,可加我的个人微信询问:kymjs666

今天继续为大家介绍kotlin开发android。如果你还不了解kotlin是什么,建议你先看看这两篇文章:使用kotlin开发androidkotlin基础语法

话不多说,首先看代码:
这是我们用kotlin做的一个附带登录逻辑的android登录界面。

/**
 * 主界面
 * @author kymjs (https://www.kymjs.com/)
 */
public class MainActivity : KJActivity() {

    var mImgHead: RoundImageView? = null
    var mEtUserName: AppCompatEditText? = null
    var mImgUserDel: ImageView? = null
    var mEtPassWord: AppCompatEditText? = null
    var mImgPwdDel: ImageView? = null
    var mBtnLogin: AppCompatButton? = null

    val kjh: KJHttp = KJHttp()

    override fun setRootView() {
        setContentView(R.layout.activity_login)
    }

    override fun initWidget() {
        mImgHead = bindView(R.id.login_img_avatar)
        mEtUserName = bindView(R.id.login_et_email)
        mImgUserDel = bindView(R.id.login_img_email_delete)
        mEtPassWord = bindView(R.id.login_et_password)
        mImgPwdDel = bindView(R.id.login_img_pwd_delete)
        mBtnLogin = bindView(R.id.login_btn)

        mBtnLogin?.setOnClickListener { v: View ->
            doLogin()
        }

        mImgUserDel?.setOnClickListener { v: View ->
            mEtUserName!!.setText(null)
        }

        mImgPwdDel?.setOnClickListener { v: View ->
            mEtUserName!!.setText(null)
            mEtPassWord!!.setText(null)
        }
    }

    fun doLogin() {
        val account: String? = mEtUserName!!.getText().toString();
        val pwd: String? = mEtPassWord!!.getText().toString();

        if (StringUtils.isEmpty(account) || StringUtils.isEmpty(pwd)) {
            toast("用户名或密码不能为空")
            return
        }

        val params: HttpParams = HttpParams()
        params.put("username", account)
        params.put("pwd", pwd)
        kjh.post("http://www.oschina.net/action/api/login_validate", params, CallBack())
    }

    public class CallBack : HttpCallBack() {
        override fun onSuccess(s: String) {
            KJLoger.debug("网络请求成功,$s")
        }

        override fun onFailure(code: Int, msg: String) {
            KJLoger.debug("网络请求失败,$msg")
        }
    }

    fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
        Toast.makeText(this, message, duration).show()
    }
}

布局文件这里就先省略了,在文章的结尾会为大家提供源码的下载链接。

类继承

首先,按顺序来,我们看到,我们定义的MainActivity继承自KJFrameForAndroid中的KJActivity类。在kotlin语言中继承是使用冒号,这个在前两篇文章中我们已经说到了。

变量声明

接着是我们的变量,我们定义了6个可变变量,使用var修饰;1个不可变的变量(类似于Java中的final),使用val修饰。而在变量类型后,我们使用了问号,表示这个变量是空指针安全的,看下面的initWidget()方法中的代码,我们之前已经将mImgUserDel声明为空安全类型的,所以在使用的时候也一定要加上问号,如果我们没有对mImgUserDel变量赋值,程序会自动跳过这条setOnClickListener语句的执行。

mImgUserDel?.setOnClickListener { v: View ->
            mEtUserName!!.setText(null)
    }

再看到代码中我们在mEtUserName后面写了两个感叹号,这里表示如果mEtUserName为空的话是会抛出空指针异常的。
另外一个小细节这里提一下,就是kotlin是支持Lambda表达式的。

抽象类不能new对象

再往下看,我们发现我们常用的KJHttp请求网络数据的使用方法变了,不能直接new一个抽象类的匿名内部类了。是的,因为kotlin不能写匿名内部类。所以我们只能自己写一个CallBack去继承HttpCallBack来实现了。这一点还是有点麻烦的,也许随着kotlin版本更新,以后会有改进吧。

为指定类添加方法

这是个非常实用的方法,像OC一样,kotlin也可以给某个类添加一些方法,比如代码中,我们给Activity类添加了一个toast方法,这样所有的Activity子类都可以拥有了toast方法。相信所有做Java的朋友都遇到过Java不能多继承的问题,虽然这给Java开发带来了很大的好处,但是在某些情况下不能多继承确实很麻烦,用kotlin的这个特性就能轻松解决这种问题了。

源码下载

https://kymjs.com/resource/KotlinTest1.zip