连载 | Kotlin 简单项目

633 阅读3分钟
原文链接: mp.weixin.qq.com

作者:张涛 (沪江Android开发工程师)
本文原创,转载请注明作者及出处。


今天继续为大家介绍 Kotlin开发 Android。如果你还不了解Kotlin是什么,建议你先看看这两篇文章:

首先看代码,这是我们用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表达式的。

为指定类添加方法

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

相关连载: